实例化:
weapons.push_back(new Pistol());
weapons.push_back(new Rifle());
weapons.push_back(new Shotgun());
析构函数,当第一次删除发生时,代码中断。当我关闭程序时会发生这种情况。
Brain::~Brain()
{
for (unsigned int i = 0; i < weapons.size(); i++)
{
delete weapons[i]; // this is where the code breaks
}
}
我收到警告:
Unhandled exception at 0x0096371f in D3D10DEMO.exe: 0xC0000005: Access violation reading location 0x000002ce.
武器是这样的:
weapons(vector<Gun*>())
编辑 - 我已经从这个问题中删除了很多代码,但是我也减少了我的程序,以便在一个更小的解决方案中重现问题:
答案 0 :(得分:7)
答案 1 :(得分:4)
你的问题是
的定义class Brain : public Entity
{
private:
std::vector<Gun*> weapons;
Brain 对象 Gun * 的所有权。
Brain::~Brain()
{
for (unsigned int i = 0; i < weapons.size(); i++)
{
delete weapons[i];
}
}
如果大脑是复制的,那么删除将被多次调用,从不同的武器向量中删除相同的枪。当您在主要功能中添加代理(代理是Brain的派生类)时,会创建一个Brain临时代码。
int main()
{
Level* level;
std::vector<Agent> agents;
level = new Level(agents);
for (int i = 0; i < 1; i++)
{
//TODO - health is a pointless parameter here
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
}
delete level;
}
如果你为 Brain 实现克隆 Gun * vector 的复制构造函数,你应该没问题。另外,您应该在向量中使用shared_ptr<Gun>
,这样就不必删除它们了。
总结一下你的问题归结为
class Foo{};
class Bar
{
public:
Bar()
{
mFooVec.push_back( new Foo() );
mFooVec.push_back( new Foo() );
}
~Bar()
{
for( unsigned int i = 0;i < mFooVec.size(); ++i )
{
delete mFooVec[i];
}
}
std::vector<Foo*> mFooVec;
};
int main()
{
Bar x;
Bar y = x;
return 0;
}
此处,条形码x和y在其 mFooVec
中具有相同的两个 Foo *