-1

可能重复:
返回指针后删除堆

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

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; 
}
4

3 回答 3

2

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

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

于 2012-09-19T08:38:45.827 回答
1

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

class MyClass {
    ...
    std::string toChar();
};

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

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

于 2012-09-19T08:45:01.180 回答
0

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

于 2012-09-19T09:07:26.637 回答