Можно ли получить указатель на внутренний массив String ^ в C ++ / CLI? - PullRequest
4 голосов
/ 15 июня 2010

Цель состоит в том, чтобы избежать копирования строковых данных, когда мне нужно const wchar_t*.

Ответ, кажется, да, но функция PtrToStringChars не имеет своей собственной записи MSDN (она упоминается только в КБ и блогах как трюк) Это вызвало у меня подозрения, и я хочу уточнить у вас, ребята. Безопасно ли использовать эту функцию?

Ответы [ 3 ]

4 голосов
/ 12 февраля 2011

Вот полное решение, основанное на PtrToStringChars, которое обращается к внутренним структурам управляемой строки, а затем копирует содержимое с использованием стандартных функций C:

wchar_t *ManagedStringToUnicodeString(String ^s)
{
    // Declare
    wchar_t *ReturnString = nullptr;
    long len = s->Length;

    // Check length
    if(len == 0) return nullptr;

    // Pin the string
    pin_ptr<const wchar_t> PinnedString = PtrToStringChars(s);

    // Copy to new string
    ReturnString = (wchar_t *)malloc((len+1)*sizeof(wchar_t));
    if(ReturnString)
    {
        wcsncpy(ReturnString, (wchar_t *)PinnedString, len+1);
    }

    // Unpin
    PinnedString = nullptr;

    // Return
    return ReturnString;
}
2 голосов
/ 15 июня 2010

Да, нет проблем. Это на самом деле несколько задокументировано , но трудно найти. Документы MSDN для библиотек C ++ не очень хороши. Возвращает внутренний указатель, который пока не подходит для преобразования в const wchar_t *. Вы должны закрепить указатель, чтобы сборщик мусора не мог переместить строку. Для этого используйте pin_ptr <>.

Вы можете использовать Marshal :: StringToHGlobalUni () для создания копии строки. Используйте это вместо этого, если wchar_t * должен оставаться в силе в течение длительного периода времени. Закрепление объектов слишком долго не очень полезно для сборщика мусора.

0 голосов
/ 15 июня 2010

Согласно этой статье: http://support.microsoft.com/kb/311259 PtrToStringChars официально поддерживается и может использоваться.Он описывается как «получить внутренний указатель gc на первый символ, содержащийся в объекте System :: String» в vcclr.h.

...