我有样的功课,和我被困...该代码看起来是这样的:删除动态对象
class X {
...
};
class Y {
public:
Y(X*);
...
};
int main() {
X* px = new X;
new Y(px);
[email protected]##
}
任务:
Y类的动态对象,以创建新的Y(px)在标有!@ ##的地方不会丢失,并且可以删除。这怎么可能?为类X和Y编写额外的代码,删除该对象。
我有样的功课,和我被困...该代码看起来是这样的:删除动态对象
class X {
...
};
class Y {
public:
Y(X*);
...
};
int main() {
X* px = new X;
new Y(px);
[email protected]##
}
任务:
Y类的动态对象,以创建新的Y(px)在标有!@ ##的地方不会丢失,并且可以删除。这怎么可能?为类X和Y编写额外的代码,删除该对象。
一个解决方案,这使我的头脑:
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
如果使用相同的Ys分段故障创建多个Xes,这可能会有潜在的问题。 – 2012-08-10 11:38:28
@EdHeal - 请参阅我的编辑。 – 2012-08-10 11:57:14
我投了票,因为潜在的问题可能很难追查到。我有过这方面的经验。 – 2012-08-10 11:57:33
它是丢失,因为您不会将new Y
的返回值保存到适当的指针变量中。
如果你不想失去它重写这样说:
Y* py = new Y(px);
// ...
delete py;
它*不*丢失,这是在问题中陈述。一个人必须提供神秘的代码,使其不会迷路。 – juanchopanza 2012-08-10 11:52:03
@juanchopanza:我明白了,从问题表达中不理解这一点。 – valdo 2012-08-11 09:37:07
您需要从new操作符(new Y(px);
)挂到指针。
即
py = new Y(px);
然后,只需使用删除px
和py
它通常是创建它应该删除它的东西好政策。
这根本不回答问题。它和@ valdo一样 – 2012-08-10 12:00:13
@DeadMG这是一个来自任务的引用,可能是:) – 2012-08-10 11:29:41