Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CString到char*_C++_Mfc_Memory Leaks_Cstring - Fatal编程技术网

C++ CString到char*

C++ CString到char*,c++,mfc,memory-leaks,cstring,C++,Mfc,Memory Leaks,Cstring,我们在大部分代码中都使用CString类。然而,有时我们需要转换为char*。目前,我们一直在使用variable.GetBuffer(0)来实现这一点,这似乎是可行的(这主要发生在将Csting传递到一个函数时,该函数需要一个char*)。函数接受这一点,我们继续 然而,我们最近开始担心这是如何工作的,以及是否有更好的方法来做到这一点 我理解它的工作方式是,它将一个char指针传递到指向CString中第一个字符的函数中,所有操作都很好 我想我们只是担心内存泄漏或任何不可预见的情况,这可能不是

我们在大部分代码中都使用CString类。然而,有时我们需要转换为char*。目前,我们一直在使用variable.GetBuffer(0)来实现这一点,这似乎是可行的(这主要发生在将Csting传递到一个函数时,该函数需要一个char*)。函数接受这一点,我们继续

然而,我们最近开始担心这是如何工作的,以及是否有更好的方法来做到这一点

我理解它的工作方式是,它将一个char指针传递到指向CString中第一个字符的函数中,所有操作都很好


我想我们只是担心内存泄漏或任何不可预见的情况,这可能不是一个好主意。

请尝试上的文档以获取帮助。

当您调用getbuffer函数时,它会为您分配内存。
完成后,您需要调用releasebuffer来解除分配它

如果您的函数只需要读取字符串而不需要修改它,请将它们更改为接受
const char*
,而不是
char*
CString
将为您自动转换,这是大多数MFC函数的工作方式,非常方便。(实际上,MFC使用的是
LPCTSTR
,它是
const TCHAR*
的同义词,适用于MBC和Unicode版本)

如果需要修改字符串,
GetBuffer(0)
是非常危险的-它不一定会为生成的字符串分配足够的内存,并且可能会出现一些缓冲区溢出错误

正如其他人所提到的,您需要在
GetBuffer
之后使用
ReleaseBuffer
。转换为
const char*

@OP: >>>我想我们只是担心内存泄漏或任何

您好,调用GetBuffer方法不会导致任何内存泄漏。因为析构函数无论如何都要释放缓冲区。但是,其他人已经警告过您调用此方法的潜在问题

@Can>>>当您调用getbuffer函数时,它会为您分配内存

这种说法并不完全正确。GetBuffer(0)不分配任何内存。它只返回一个指向内部字符串缓冲区的指针,该缓冲区可用于直接从CString类的“外部”操作字符串

但是,如果您传递一个数字,比如像GetBuffer(N)一样对它传递N,并且如果N大于缓冲区的当前长度,那么函数通过分配更多内存来确保返回的缓冲区至少与N一样大

干杯, 拉杰什。
MVP,Visual++。

我已经trid了strtol(),它不会自动从CString转换为const char*。你是怎么做到的?我还尝试了类型转换,但也不起作用。@henryyao使用
\u tcstol