CString to char * - PullRequest
       95

CString to char *

17 голосов
/ 18 февраля 2009

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

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

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

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

Ответы [ 4 ]

24 голосов
/ 18 февраля 2009

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

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

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

8 голосов
/ 06 октября 2009

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

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

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

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

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

Ура, Раджеш. MVP, Visual ++.

3 голосов
/ 18 февраля 2009

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

1 голос
/ 18 февраля 2009

попробуйте документацию по http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx для помощи по этому вопросу.

...