我有樣的功課,和我被困...該代碼看起來是這樣的:刪除動態對象
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