如果没有正确删除,为什么wstring :: c_str不会导致内存泄漏

mon*_*ksy 5 c++ widestring wstring multibyte

代码段1:

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

代码段2

wstring wstr = L"a value";
wchar_t *value = wstr.c_str();
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 11

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

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

aString()返回指向使用创建的缓冲区的指针new[],因此您必须在完成后删除它(使用delete[],匹配new[]).这是容易出错的,这就是为什么它是更好的做法是使用资源管理类(比如string,wstring,容器和智能指针),而不是绕过原始指针,并希望他们正确对待.