2012-08-10 93 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