【问题标题】:Who should free Memory? [duplicate]谁应该释放内存? [复制]
【发布时间】:2012-09-19 08:34:19
【问题描述】:

可能重复:
delete heap after returning pointer

我有一个带有成员函数的类:

char* toChar();

成员函数分配内存并返回指向该内存的指针...

假设我会这样使用它:

int main() {
    MyClass mc = new MyClass();
    char* str = mc.toChar();

    return 0; 
}

我应该在哪里释放内存?在类的析构函数中或者在这样的程序中:

int main() {
    MyClass * mc = new MyClass();
    char* str = mc.toChar();
    // tostuff with str
    delete mc;
    delete[] str; 

    return 0; 
}

【问题讨论】:

  • 由您决定和记录。但最好使用smart pointer
  • 拥有那段记忆?关于创建它的MyClass 实例,它的生命周期 是多少?它实际上是如何使用的?
  • 裸指针是邪恶的。你刚刚发现了原因。现在开始相信你不应该使用它们。
  • @Kerrek:const 引用是“邪恶的”,原因完全相同,一些 numty^Hnovice 可能会看到一个 const 引用,但不知道谁拥有与该引用关联的任何资源。现在告诉我你认为你不应该使用 const 引用:-p
  • @SteveJessop:我不关注......如果你看到一个 const 引用,你通常不会关心谁拥有它。你只是假设不是你。

标签: c++ memory memory-management


【解决方案1】:

如果您希望它可重用(也就是说,您可以多次调用它并且它可能返回不同的值,可能是因为类已更改),那么您应该在 main 中释放它。否则由你决定。

但一般来说,您不应该使用纯字符串。您应该将其更改为使用std::string,然后按值返回。

【讨论】:

    【解决方案2】:

    成员函数应该返回一个管理内存的对象。通常是std::unique_ptr,但对于char 数据std::string 可能更合适:

    class MyClass {
        ...
        std::string toChar();
    };
    
    int main() {
        MyClass mc;
        std::string str = mc.toChar();
    }
    

    请注意,通过同时使mc 成为托管对象(这里它直接在堆栈上进行管理;unique_ptr 也可以工作,但在很大程度上是不必要的),delete 不需要出现在代码中的任何位置.一般来说,除非您正在编写自己的容器,否则delete 不应出现在您的代码中。

    【讨论】:

    • 即使您正在编写自己的容器,delete 仍然不应出现在您的代码中。使用内存分配器使它们可配置,就像标准容器一样,然后在分配器上使用 destroydeallocate :-)
    • 为什么不使用new/delete?在编程时使用大脑应该可以解决大多数问题......所有 smart_pointers 使用也删除以释放内存。
    • @anhadikal 实际上,正如 Steve Jessop 指出的那样,智能指针使用分配器来释放内存。使用原始指针将导致意外代码路径的内存泄漏,例如例外。
    【解决方案3】:

    问题是谁是 str 所指向的那块内存的“所有者”。由于 mc 返回一个 char* 而不是 const char*,它允许客户端 (str) 修改字符串的值,所以我想说 str 也应该因此负责释放内存。如果 mc 释放内存但 str 仍想访问它会发生什么?该进程将被终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多