CString到char *

时间:2009-02-18 01:25:58

标签: c++ mfc memory-leaks cstring

我们在大多数代码中使用CString类。但有时我们需要转换为char *。目前我们一直在使用variable.GetBuffer(0)这样做,这似乎有效(这主要发生在将Csting传递给函数需要char *的函数时)。该函数接受了这一点,我们继续前进。

然而,我们最近担心这是如何运作的,以及是否有更好的方法。

我理解它的工作方式是将char指针传递给指向CString中第一个字符的函数,并且一切运行良好。

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

4 个答案:

答案 0 :(得分:24)

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

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

正如其他人所提到的,您需要在ReleaseBuffer之后使用GetBuffer。转换为const char *时,您无需执行此操作。

答案 1 :(得分:8)

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

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

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

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

但是,如果你传递一个数字,比如GetBuffer(N)就说N,如果N大于缓冲区的当前长度,那么函数确保返回的缓冲区至少与N一样大。分配更多的内存。

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

答案 2 :(得分:3)

当你调用getbuffer函数时,它会为你分配内存。 当你完成它之后,你需要调用releasebuffer来释放它

答案 3 :(得分:1)

相关问题