代码段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[])。这是容易出错的,这就是为什么它是更好的做法是使用资源管理类(比如stringwstring,容器和智能指针),而不是绕过原始指针,并希望他们正确对待。

scroll top