我们在大部分代码中都使用了CString类。但是,有时我们需要转换为char *。目前,我们已经使用variable.GetBuffer(0)实现了这一点,这似乎是可行的(这主要发生在将Csting传递到需要char *的函数中时)。函数接受了这一点,我们继续前进。
然而,我们最近开始担心这是如何工作的,以及是否有更好的方法来做到这一点。
我理解它的工作方式是,它将一个字符指针传递到指向CString中第一个字符的函数中,一切都很正常。
我猜我们只是担心内存泄漏或任何不可预见的情况,这可能不是一个好主意。
发布于 2009-02-18 01:37:06
如果您的函数只需要读取字符串,而不需要修改它,请将它们更改为接受const char *而不是char *。CString会自动为你转换,这就是大多数MFC函数的工作方式,非常方便。(实际上MFC使用LPCTSTR,它是const TCHAR *的同义词,同时适用于MBC和Unicode构建)。
如果您需要修改字符串,GetBuffer(0)是非常危险的-它不一定会为结果字符串分配足够的内存,并且您可能会得到一些缓冲区溢出错误。
正如其他人所提到的,您需要在GetBuffer之后使用ReleaseBuffer。您不需要在转换为const char *时执行此操作。
发布于 2009-10-06 15:46:46
@ the OP:>>>我猜我们只是担心内存泄漏或任何...
您好,调用GetBuffer方法不会导致任何内存泄漏。因为析构函数无论如何都会释放缓冲区。但是,其他人已经警告您调用此方法的潜在问题。
@Can >>>当你调用getbuffer函数时,它会为你分配内存。
这句话并不完全正确。GetBuffer(0)不分配任何内存。它只返回一个指向内部字符串缓冲区的指针,该缓冲区可用于直接从CString类“外部”操作字符串。
但是,如果您传递一个数字,就像GetBuffer(N)那样对它设为N,并且如果N大于缓冲区的当前长度,则该函数通过分配更多的内存来确保返回的缓冲区至少与N一样大。
干杯,拉杰什。最有价值的视觉++。
发布于 2009-02-18 01:29:13
当您调用getbuffer函数时,它会为您分配内存。使用完它后,需要调用releasebuffer来释放它。
https://stackoverflow.com/questions/559483
复制相似问题