CString до char *

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

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

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

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

Ответ 1

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

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

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

Ответ 2

@OP: → > Я думаю, мы просто обеспокоены утечками памяти или любым...

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

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

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

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

Cheers, Раджеш. MVP, Visual ++.

Ответ 3

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