如果我有一个结构/对象的指针,并且该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;
};
以后当玩家“死亡”时,不应删除该设备。
答案 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_ptr
或unique_ptr
。他们会照顾new
和delete
,这些都是非常难以完全正确无助的。这些可以在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