【问题标题】:Need to delete CString after use to free memory?使用后需要删除 CString 以释放内存吗?
【发布时间】:2012-06-11 20:07:35
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-c++ mfc cstring


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          new上分配内存,所以

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

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

          没有new,你在stack上进行分配,所以

          CString asdf("ASDF");
          

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

          另外,CString 会清理自己的资源,所以如果CString 对象被清理(如果它在堆栈上则超出范围,如果它在堆上则被删除),它使用的资源也会清理干净。

          【讨论】:

          • 这很有意义。感谢您的澄清。这正是我正在寻找的答案。
          猜你喜欢
          • 2019-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 1970-01-01
          • 2018-04-02
          • 2014-02-18
          • 1970-01-01
          相关资源
          最近更新 更多