我有一个具有成员函数的类:
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;
}
答案 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仍想访问它会发生什么?该过程将被终止。