谁应该释放记忆?

时间:2012-09-19 08:34:19

标签: c++ memory memory-management

  

可能重复:
  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; 
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

成员函数应返回管理内存的对象。通常情况为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不应出现在您的代码中。

答案 2 :(得分:0)

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