我有一种家庭作业,但我被困住了......代码如下所示:
class X {
...
};
class Y {
public:
Y(X*);
...
};
int main () {
X* px = new X;
new Y(px);
!@##
}
任务:
使用 new Y(px) 创建的 Y 类的动态对象在 !@## 处不会丢失,可以删除。这怎么可能?为类 X 和 Y 编写附加代码,以删除对象。
我想到的一种解决方案是:
Y
inclass X
Y
,更改指向的对象,X*
使其具有指向新创建Y
对象的指针X
释放内存的析构函数中,由指针指向,存储创建Y
对象的地址由于@EdHeal 的评论,我将进行编辑:是的,存在潜在问题。使用这种“方法”,您可能会尝试多次删除同一个Y
对象(如果它被传递给多个X
对象)。
这是事实,但这是极少数情况。
如果指针X::Y*
是私有的并且没有getter(换句话说,X
是这个对象的唯一所有者Y
),那么就没有这种可能性。
要 double+ 删除 new Y
,您需要将某个X
对象的指针传递给Y
, 到另一个X
对象。换句话说,类似:
X* px = new X;
new Y(px);
X* another_px = new X;
another_px->Y_pointer = px->Y_pointer; // or using some accessors
想想当Y(px)
被执行时会发生什么。叫什么?你怎么能用它?
它丢失了,因为您没有将 的返回值保存new Y
到适当的指针变量中。
如果您不想丢失它,请以这种方式重写:
Y* py = new Y(px);
// ...
delete py;
您需要抓住来自新运算符 ( new Y(px);
) 的指针。
IE
py = new Y(px);
然后只需使用删除px
和py
对于创建它的事物来说,删除它通常是好的策略。