0

我有一种家庭作业,但我被困住了......代码如下所示:

class X {  
...  
};  

class Y {  
public:   
Y(X*);  
...  
};

int main () {  
X* px = new X;  
new Y(px);  
!@##   
}

任务:

使用 new Y(px) 创建的 Y 类的动态对象在 !@## 处不会丢失,可以删除。这怎么可能?为类 X 和 Y 编写附加代码,以删除对象。

4

4 回答 4

2

我想到的一种解决方案是:

  • 添加一个指向Yinclass 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
于 2012-08-10T11:28:47.473 回答
1

想想当Y(px)被执行时会发生什么。叫什么?你怎么能用它?

于 2012-08-10T11:27:46.473 回答
0

丢失了,因为您没有将 的返回值保存new Y到适当的指针变量中。

如果您不想丢失它,请以这种方式重写:

Y* py = new Y(px);

// ...

delete py;
于 2012-08-10T11:26:33.743 回答
0

您需要抓住来自新运算符 ( new Y(px);) 的指针。

IE

py = new Y(px);

然后只需使用删除pxpy

对于创建它的事物来说,删除它通常是好的策略。

于 2012-08-10T11:29:26.033 回答