请考虑以下代码段:
#include <iostream>
using namespace std;
class X {
public:
class Z {
public:
void f() {
cout << "Z().f()" << endl;
}
};
class Y {
public:
int A;
Y(int x) {
A = x;
}
int c() {
return A;
}
};
public:
Z* z;
// How to free Y instance ?
Y* a(int x) {
Y* y = new Y(x);
return y;
}
public:
X() {
z = new Z();
}
~X() {
delete z;
}
};
int main(void) {
int a;
X* x = new X();
cout << "input :" << endl;
cin >> a;
cout << "result : " << x->a(a)->c() << endl;
x->z->f();
delete x;
return 0;
}
虽然可以轻松地在~X()上释放Z对象,但我很好奇如何释放Y?因为我没有指定任何变量来保存其内存地址。
顺便问一下,这样的术语是什么? X-&gt;一种(A) - &以及c()谢谢。 :)
答案 0 :(得分:4)
// How to free Y instance ?
Y* a(int x) {
Y* y = new Y(x);
return y;
}
嗯,问题是函数原型不清楚谁负责删除实例。但由于只有调用者具有该实例的句柄,因此它应该是被调用的删除责任。这应该有详细记录。但最好的方法是使用具有正确所有权语义的smart pointer。在这种情况下,std::unique_ptr<Y>
似乎是一个合适的匹配,仅仅使用它的事实使得意图明确,无需有关所有权的文档:
std::unique_ptr<Y> a(int x)
{
return std::unique_ptr<Y>( new Y(x) );
}
答案 1 :(得分:1)
您正在从函数返回内存,因此由调用者删除它:
X x;
Y *ptr = x.a(5);
delete ptr;
希望你永远不必做这样的事情。如果必须,那么建议您使用智能指针,例如shared_ptr
或unique_ptr
。
std::unique_ptr<Y> a(int x) {
return std::unique_ptr<Y>(new Y(x));
}
有了这个,你永远不必担心删除实例,因为指针类的析构函数负有这个责任。