2009-02-18 2 views
17

Мы используем класс CString на протяжении большей части нашего кода. Однако иногда нам нужно преобразовать в char *. на данный момент мы это делаем с использованием переменной. GetBuffer (0), и это, похоже, работает (это происходит, главным образом, при передаче Csting в функцию, где функция требует char *). Функция принимает это, и мы продолжаем идти.CString to char *

Однако в последнее время мы обеспокоены тем, как это работает, и есть ли лучший способ сделать это.

Способ, которым я понимаю, что он работает, передаёт указатель char в функцию, указывающую на первый символ в CString, и все работает хорошо.

Я думаю, мы просто обеспокоены утечками памяти или непредвиденными обстоятельствами, когда это может быть не очень хорошая идея.

ответ

24

Если функции требуется только чтение строки и не изменяя его, изменить их принять const char * вместо char *. CString будет автоматически конвертировать для вас, так работает большинство функций MFC, и это очень удобно. (Фактически MFC использует LPCTSTR, что является синонимом для const TCHAR * - работает как для MBC, так и для Unicode-сборок).

Если вам необходимо изменить строку, GetBuffer(0) очень опасно - он не обязательно будет выделять достаточное количество памяти для результирующей строки, и вы можете получить ошибки переполнения буфера.

Как уже упоминалось, вам необходимо использовать ReleaseBuffer после GetBuffer. Вам не нужно делать это для преобразования в const char *.

+0

Я trid strtol(), и он не автоконвертируется из CString в const char *. Как ты это делаешь? Я также попробовал тип cast, также не работает. – henryyao

+0

@henryyao использовать '_tcstol' вместо этого. –

+0

Работает отлично !!! – henryyao

3

Когда вы вызываете функцию getbuffer, она выделяет для вас память. , когда вы сделали с ним, вам нужно позвонить releasebuffer для освобождения его

8

@ ОП: >>> Я думаю, мы просто беспокоюсь об утечках памяти или любой ...

Привет, вызов метода GetBuffer не приведет к каким-либо утечек памяти. Поскольку деструктор все равно освободит буфер. Однако другие уже предупреждали вас о потенциальных проблемах при вызове этого метода.

@Can >>>Когда вы вызываете функцию getbuffer, она выделяет для вас память.

Это утверждение не совсем верно. GetBuffer (0) НЕ выделяет память. Он просто возвращает указатель на внутренний буфер строки, который можно использовать для управления строкой непосредственно из «снаружи» класса CString.

Однако, если вы передаете число, скажите N ему, как GetBuffer (N), и если N больше текущей длины буфера, то функция гарантирует, что возвращаемый буфер будет как минимум равным N путем выделения большего объема памяти.

Cheers, Rajesh. MVP, Visual ++.

 Смежные вопросы

  • Нет связанных вопросов^_^