使用后需要删除CString以释放内存
Need to delete CString after use to free memory?
如果我使用这样的CString:
void myFunc(char *str)
{
CString s(str);
// Manipulate other data with CString
// ...
// Finished
// Should I somehow delete 's' here to avoid a memory leak?
}
一旦函数超出范围,字符串是否会被删除?
另外,我知道 new
关键字分配内存,如果我构造一个没有 new
关键字的对象,内存是否仍然分配?我的直觉告诉我是的,但我想验证一下。
例如
CString *asdf = new CString("ASDF");
// same as?
CString asdf("ASDF");
new
在 堆上分配内存,因此
CString *asdf = new CString("ASDF");
在堆上分配一个CString
,并将指向它的指针分配给asdf
。该内存不会被释放,也不会调用asdf
的析构函数,直到您调用delete asdf
。
如果没有new
,您将在堆栈上进行分配,因此
CString asdf("ASDF");
分配堆栈内存,asdf
表示堆栈内存。当堆栈展开时(如从函数返回时),会自动回收此内存,并且当asdf
的析构函数超出范围时会自动调用它。
此外,CString
会清理自己的资源,因此,如果清理了CString
对象(如果它在堆栈上,则超出范围,如果它在堆上,则被删除),则它使用的资源也将被清理。
CString
管理字符串字符本身的内存,因此它将负责在其析构函数中释放此类内存(它更聪明一点,但可以这样想)。
如果您使用new
分配CString
并且从不对其调用delete
,不仅会泄漏CString
对象的内存,而且永远不会调用其析构函数,因此也会泄漏字符串字符的内存。
在大多数情况下,当您创建 CString 对象时,您最终会得到两个分配,一个用于对象本身,另一个用于字符串的字符。字符分配隐藏在对象中,您不必担心。如果您像第一个示例一样将对象声明为自动变量,则该对象将在块的末尾(即右大括号)处释放。如果使用new
分配它,则必须稍后delete
它,否则将出现内存泄漏。
如果您在堆栈上分配一个对象(即如果您不使用 new),那么当它在函数结束时超出范围时,它将自动销毁。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在C++中使用Cstring反转字符串
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 如何转换真实路径 CString c++
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用后需要删除CString以释放内存
- CString 的 ReleaseBuffer 会释放 Shell 分配的 CoTaskMemAlloc 字符串吗?