如何在不破坏内部指针(struct / object)的情况下删除指向(struct / object)的指针?

时间:2012-06-22 08:24:10

标签: c++ object pointers struct

如果我有一个结构/对象的指针,并且该struct / object包含另外两个指向其他对象的指针,我想删除“包含两个指针的对象而不破坏它所持有的指针” - 我该怎么办那样做?

指向对象A的指针(包含指向对象B的指针,包含指向对象C的指针)。 删除对象A. 删除指向对象A的指针,指向对象B / C的指针仍然存在。

我有什么必须做才能使这项工作?

更新

这是一个游戏项目,我希望这能解释它。现在,我有一些“问题”甚至把两个指针放在第一个结构(A)中的B,C

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;
};

以后当玩家“死亡”时,不应删除该设备。

5 个答案:

答案 0 :(得分:3)

指针(A)中包含的指针(B& C)将不会被删除,除非您通过析构函数明确地执行此操作。但你不能使用指针A访问B& C一旦删除指针A。

注意:您应该在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 :(得分: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

修改

在你的情况下,盔甲和武器不会被摧毁。你只是失去了对它们的指针(并得到了记忆泄漏)。我建议你把所有的盔甲和武器放在一些容器中(比如std::vector)来保持指针

答案 2 :(得分:1)

  

指向对象A的指针(包含指向对象B的指针,包含指向对象的指针)   对象C)。删除对象删除对象A的指针,指向   对象B / C仍然存在?

,它们处于未定义状态。任何事都可能发生在他们身上。可能在你的系统中,你注意到它们存在,但是假设它只是一种幻觉,每次都不能保证。

一旦删除A*,其所有内容都可用于下一次动态分配。可能以后他们可能会被分配给其他对象。某些系统可以0删除所有删除的内容。再一次,任何事情都可能发生!

  

我有什么必须做才能使这项工作?

在删除B*之前,将C*A*存储到其他指针。然后就完全没问题了,因为对象完好无损且存储了地址。

答案 3 :(得分:0)

如果不首先复制a和b,我认为这是不可能的。

答案 4 :(得分: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