2012-08-10 41 views
-1

我有样的功课,和我被困...该代码看起来是这样的:删除动态对象

class X { 
... 
}; 

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

int main() { 
X* px = new X; 
new Y(px); 
[email protected]## 
} 

任务:

Y类的动态对象,以创建新的Y(px)在标有!@ ##的地方不会丢失,并且可以删除。这怎么可能?为类X和Y编写额外的代码,删除该对象。

+0

@DeadMG这是一个来自任务的引用,可能是:) – 2012-08-10 11:29:41

回答

2

一个解决方案,这使我的头脑:

  • 一个指针class X
  • Y构造函数添加到Y,改变对象,通过指出,有一个指向新创建Y对象
  • 在析构函数中的X释放内存,由指针指向,它存储创建的对象的地址Y对象

我会编辑,因为@EdHeal的评论:有一个潜在的问题,是的。使用这种“方法”,您可以尝试删除不止一次的对象(如果它传递给多个X对象)。

这是真的,但这是一种罕见的情况。
如果指针X::Y*是私有的,并且存在 getter(换句话说,X是此对象的唯一所有者Y),则不存在这种可能性。

要加倍+删除新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 
+0

如果使用相同的Ys分段故障创建多个Xes,这可能会有潜在的问题。 – 2012-08-10 11:38:28

+0

@EdHeal - 请参阅我的编辑。 – 2012-08-10 11:57:14

+0

我投了票,因为潜在的问题可能很难追查到。我有过这方面的经验。 – 2012-08-10 11:57:33

0

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

如果你不想失去它重写这样说:

Y* py = new Y(px); 

// ... 

delete py; 
+1

它*不*丢失,这是在问题中陈述。一个人必须提供神秘的代码,使其不会迷路。 – juanchopanza 2012-08-10 11:52:03

+0

@juanchopanza:我明白了,从问题表达中不理解这一点。 – valdo 2012-08-11 09:37:07

1

想想这是怎么回事时,Y(px)被执行的。什么叫什么?你怎么用它?

+0

+1用于阅读问题并且不提供答案。 – juanchopanza 2012-08-10 11:52:33

0

您需要从new操作符(new Y(px);)挂到指针。

py = new Y(px); 

然后,只需使用删除pxpy

它通常是创建它应该删除它的东西好政策。

+1

这根本不回答问题。它和@ valdo一样 – 2012-08-10 12:00:13