3

如果我使用这样的 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"); 
4

4 回答 4

17

new在堆上分配内存,所以

CString *asdf = new CString("ASDF");

在堆上分配aCString并将指向它的指针分配给asdf。该内存不会被释放,在asdf你调用之前也不会调用析构函数delete asdf

没有new,你在堆栈上分配,所以

CString asdf("ASDF");

分配栈内存,asdf代表。当堆栈展开时(如从函数返回时),此内存会自动回收,并且asdf在超出范围时会自动调用析构函数。

此外,CString清理自己的资源,所以如果CString对象被清理(如果它在堆栈上超出范围,或者如果它在堆上被删除),它使用的资源也将被清理。

于 2012-06-07T18:20:50.310 回答
1

CString管理字符串字符本身的内存,所以它会在其析构函数中释放这些内存(它有点聪明,但这样想)

如果您分配一个CStringwithnew并且从不调用delete它,那么您不仅会泄漏CString对象的内存,而且它的析构函数也不会被调用,因此您也会泄漏字符串字符的内存。

于 2012-06-07T18:15:00.667 回答
1

在大多数情况下,当您创建一个 CString 对象时,您最终会得到两个分配,一个分配给对象本身,一个分配给字符串的字符。字符分配隐藏在对象中,您不必担心。如果您像在第一个示例中那样将对象声明为自动变量,则该对象将在块的末尾(即右大括号)被释放。如果你分配它,new你必须稍后再分配它,delete否则会有内存泄漏。

于 2012-06-07T18:20:39.850 回答
0

如果你在堆栈上分配一个对象(即如果你不使用new),那么当它在函数结束时超出范围时它会自动销毁。

于 2012-06-07T18:15:35.187 回答