2009-02-18 63 views
17

我们在大部分代码中使用CString类。但有时我们需要转换为char *。目前我们一直在使用variable.GetBuffer(0)来做这件事,这看起来很有效(这主要发生在将Csting传递给函数需要char *的函数时)。该功能接受这一点,我们继续前进。CString to char *

但是我们最近已经担心这是如何工作的,以及是否有更好的方法来做到这一点。

我理解它的工作方式是它将一个字符指针传入指向CString中第一个字符的函数中,并且所有工作都很好。

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

回答

24

如果您的功能只需要在字符串和不修改它,改变他们接受的const char *代替char *CString会自动转换为你,这是大多数MFC功能的工作原理,它非常方便。 (其实MFC使用LPCTSTR,这是const TCHAR *的同义词 - 适用于MBC和Unicode版本)。

如果需要修改字符串,GetBuffer(0)是很危险的 - 用于生成的字符串也不见得会分配足够的内存,你可以得到一定的缓冲溢出错误。

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

+0

我trid的strtol(),它不会自动从CString转换为const char *。你是怎样做的?我也试过类型转换,也不行。 – henryyao 2014-07-25 16:46:05

3

当你调用getbuffer函数时,它为你分配内存。 ,当你用它做,你需要调用releasebuffer释放它

8

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

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

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

此声明并非完全正确。 GetBuffer(0)不分配任何内存。它只是返回一个指向内部字符串缓冲区的指针,它可以用来直接从CString类的“外部”操纵字符串。然而,如果你传递一个数字,就像GetBuffer(N)那样说N,如果N大于缓冲区的当前长度,那么该函数确保返回的缓冲区至少与N一样大通过分配更多的内存。

干杯, Rajesh。 MVP,Visual ++。