gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:48 27 4
gpt4 key购买 nike

代码段 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 的内部代码在我看来是一样的。

最佳答案

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

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

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

关于c++ - 如果没有正确删除,为什么 wstring::c_str 不会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com