为什么不wstring的:: c_str导致内存泄漏,如果不妥善删除
-
26-09-2019 - |
题
代码段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看起来是一样的我。
解决方案
这是重要的规则:你必须在被delete
创建任何使用new
,你必须不删除任何东西。
wstr.c_str()
指针返回至由所述wstring
对象管理的缓冲器。当字符串被破坏,在此之后,指针将不再有效,它会被释放。在这个利用delete
是错误的。如果修改字符串的指针也将失效。
aString()
返回一个指针,它是使用new[]
创造了一个缓冲区,所以你必须删除它,当你完成它(使用delete[]
,匹配new[]
)。这是容易出错的,这就是为什么它是更好的做法是使用资源管理类(比如string
,wstring
,容器和智能指针),而不是绕过原始指针,并希望他们正确对待。
其他提示
由于c_str()
将返回一个指向wstring
的内部表示。类保持它包含的数据的控制。
从basic_string::c_str()
从MSDN 文档两者一个>:
<强>返回的C风格串不应该 是强>改性,因为这可能无效 的指针串,或删除, 作为串具有有限的寿命 并且由类字符串强>拥有。
我要出去肢体和说,一个wstring的是不是一个wchar_t的,而是有操作类返回一个wchar_t的*,所以在wstring的析构函数,它可能释放自己的副本的*它返回wchar_t的。
不隶属于 StackOverflow