使用后需要删除CString以释放内存

Need to delete CString after use to free memory?

本文关键字:CString 释放 内存 删除      更新时间:2023-10-16

如果我使用这样的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),那么当它在函数结束时超出范围时,它将自动销毁。