5

代码段 1:

wchar_t *aString() 
{
     wchar_t *str = new wchar[5];
     wcscpy(str, "asdf\0");
     return str;
}
wchar_t *value1 = aString();

代码段 2

wstring wstr = L"a value";
wchar_t *value = wstr.c_str();

如果未删除代码段 2 中的值,则不会发生内存泄漏。但是,如果未删除代码段 1 中的 value1,则存在内存泄漏。wstring::c_str 的内部代码在我看来是一样的。

4

4 回答 4

11

一条重要规则:您必须delete在由 创建的任何内容上使用new,并且不得删除其他任何内容。

wstr.c_str()返回指向由wstring对象管理的缓冲区的指针。当字符串被销毁时,它将被释放,之后指针将不再有效。在此使用delete是错误的。如果修改字符串,指针也会失效。

aString()返回一个指向使用 创建的缓冲区的指针new[],因此您必须在完成后将其删除(使用delete[], 匹配new[])。这很容易出错,这就是为什么最好使用资源管理类(如stringwstring、容器和智能指针)而不是传递原始指针并希望它们得到正确处理的原因。

于 2010-08-06T15:04:32.520 回答
2

basic_string::c_str() 取自 MSDN的文档:

不应修改返回的 C 样式字符串,因为这可能会使指向字符串的指针无效或被删除,因为字符串的生命周期有限并且归类 string 所有

于 2010-08-06T15:05:57.907 回答
2

因为c_str()返回一个指向内部表示的指针wstring。该类保持对它包含的数据的控制。

于 2010-08-06T15:03:31.233 回答
1

我要冒昧地说一个 wstring 不是 wchar_t,而是一个具有返回 wchar_t * 的运算符的类,所以在 wstring 的析构函数中,它可能会释放它自己的 wchar_t 副本* 它返回。

于 2010-08-06T14:58:05.700 回答