2012-06-22 42 views
0

如果我有一個指向結構/對象的指針,並且該結構/對象包含另外兩個指向其他對象的指針,並且我想刪除「包含兩個指針的對象而不銷燬指針」 - 我該怎麼辦那?如何在不破壞指針(struct/object)的情況下刪除指向(struct/object)的指針?

指向對象A的指針(包含指向對象B的指針,包含指向對象C的指針)。 刪除對象A 指向對象A的指針被刪除,指向對象B/C的指針仍然存在。

有什麼我必須做的,使這項工作?

UPDATE

它是一個遊戲項目,我希望這可以解釋它。現在,我有一些「問題」,甚至把兩個指針到B,C中的第一個結構(A)

struct Player 
{ 
    char * Name; 
    Weapon* PlayerWeapon; 
    Armor* PlayerArmor; 
}; 

struct Weapon 
{ 
    char * Name; 
    int Damage; 
}; 

struct Armor 
{ 
    char * Name; 
    int Resistance; 
}; 

而這在某種程度上是行不通的。

Player* CreatePlayer(char * Name, Weapon* weapon, Armor* armor) 
{ 
    Player *pPlayer = new Player; 

    pPlayer->Name = name; 
    pPlayer->Weapon = weapon; 
    pPlayer->Armor = armor; 
}; 

而後來當玩家「死亡」時,該設備不應該被刪除。

+0

我們需要更多的細節。成員是否在struct的析構函數中被銷燬? – Dialecticus

+1

你是否真的試圖做到這一點,並遇到一些問題?因爲刪除一個結構體不會在它所包含的指針上調用delete。 – Rook

+1

誰擁有* B和C?什麼決定什麼時候應該刪除? – Potatoswatter

回答

1
struct Foo 
{ 
    A *a; 
    B *b; 
} 

Foo *foo = new Foo(); 
delete foo; //foo now points to garbage. you can't use it 
foo = nullptr; //don't use foo! 

但你可以這樣做:

Foo *foo new Foo(); 
//do some stuff with foo 
A *a = foo->a; 
B *b = foo->b; 
delete foo; 
foo = nullptr; 
// if Foo does not destroy objects pointed by a,b in destructor you can still 
//use them through a,b vars 
a->doSomeStuff(); //ok 
b->doSomeOtherStuff(); //ok 

編輯

在你的情況盔甲和武器不被破壞。你只是失去了指針(並得到memeory泄漏)。我建議你把所有的裝甲和武器放在一些容器中(如std::vector)以保持指針

+0

更新了我的帖子,請看我的例子。 – Deukalion

+0

@Deukalion:請參閱我的編輯 – Andrew

0

如果不先製作a和b的副本,我認爲這是不可能的。

1

指向對象A的指針(包含指向對象B的指針,包含指向 對象C的指針)。刪除對象刪除對象A的指針,指向 對象B/C仍然存在?

沒有,他們在不確定狀態。任何事都可能發生在他們身上。可能在你的系統中,你注意到它們是存在的,但假設它只是一種錯覺,每次都不能保證。

只要您刪除A*,它的所有內容都可用於下一個動態分配。可能他們可能會在稍後分配給其他對象。有些系統,可能0出所有被刪除的。再次,任何事情都可能發生

有什麼我必須做的,使這項工作?刪除A*

商店B*C*給其他指針。然後它完全可以,因爲對象是完整的,並且你有它的地址存儲。

+0

只是爲了強調:對象'B'和'C'依然存在,但是它們是屬於'A'主體的*指針*不存在。指向同一對象的其他指針仍然存在,這就是爲什麼要在刪除「A」之前複製指針的原因。 –

3

指針(A)中包含的指針(B & C)不會被刪除,除非您通過析構函數明確執行它。但是,如果刪除指針A,則無法使用指針A訪問B & C.

注意:您應該在類A中擁有複製構​​造函數和= overloaed運算符,以避免淺拷貝。

如果你想對其他玩家使用相同的裝甲和武器,請確保你沒有刪除玩家析構函數中的武器和裝甲。然後,你可以使用相同的指針,像這樣的另一個球員。

Weapon* weapon = CreateWeapon(); 
Armor* armor = CreateArmor(); 

Player* player1 = CreatePlayer("Alpha", weapon, armor); 
delete player1; 

Player* player2 = CreatePlayer("Beta", weapon, armor); 
delete player2; 
+1

如果結構不擁有指向的對象,也許你想*淺拷貝。或根本不復制。 –

+0

更新我的帖子,請看我的例子。 – Deukalion

+0

@Deukalion:不確定你是怎麼說玩家被刪除時武器被刪除的?你是否在播放器的析構器中釋放了武器的記憶? – Jeeva

0

你應該避免使用「裸」指針。最好使用智能指針類,如shared_ptrunique_ptr。他們照顧的newdelete,這是非常棘手得到完全正確的獨立。這些可以在Boost中找到,shared_ptr也可能在編譯器附帶的TR1庫(std::tr1::)中,或者如果您的編譯器更新,可能只是簡單的std::

雖然你沒有多說這個程序,但如果有必要做一些保留指針,聽起來像對象A只有B和C指針的副本。這是unique_ptr的工作。

在C++ 11,

struct A_type { 
    std::unique_ptr<B_type> B; // Object *owns* B and C 
    std::unique_ptr<C_type> C; 
}; 

std::unique_ptr<A_type> A(new A_type); 

auto my_B = std::move(A->B); // Acquire ownership away from object 
auto my_C = std::move(A->B); 
A.release(); // Delete object and anything it owns (at this point, nothing) 

// my_B and my_C are guaranteed to be destroyed at some appropriate time 
+0

想必如果他不想刪除指針,那是因爲它們被用於導航,而不是所有權。 (根據我的經驗,這通常是這種情況。)爲此使用'shared_ptr'將導致循環,並且使用'unique_ptr'根本不起作用。 –

+0

@James:哈哈! 「導航而不是所有權」,很好的詞組。當我有這個論點時,我會談論如何使用原始指針來定義「結構」,這比「導航」更清晰。下一階段的論點似乎是「很好,然後使用'weak_ptr',因爲很明顯,修復太多智能指針會增加更多智能指針」;-) –

+0

@JamesKanze但是在那種情況下,他不會有在物體被摧毀之前就已經到達了關於保存它們的擔憂,因爲會存在其他導航路徑。那是我在寫答案之前想到的第一件事。對於一個隨機圖,具有'weak_ptr'來斷開循環的'shared_ptr'是通用建議。無論如何,這個問題(正如我回答的那樣)是非常模糊的。 – Potatoswatter