为什么要删除此对象导致问题?

时间:2011-11-24 11:46:01

标签: c++ winapi

实例化:

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*>())

编辑 - 我已经从这个问题中删除了很多代码,但是我也减少了我的程序,以便在一个更小的解决方案中重现问题:

http://dl.dropbox.com/u/13519335/D3D10DEMO_0.25.MinRep.zip

2 个答案:

答案 0 :(得分:7)

您尚未为武器类定义虚拟析构函数。 http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.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 *