C++ 为什么删除此对象会导致问题?

C++ 为什么删除此对象会导致问题?,c++,winapi,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]; //

实例化:

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
    }
}
武器是这样的:

weapons(vector<Gun*>())
武器(向量())
编辑-我已经删除了这个问题的大部分代码,但我也减少了我的程序,以便在更小的解决方案中重现问题:


您尚未为武器类定义虚拟析构函数。
你的问题在于

class Brain : public Entity
{
private:
    std::vector<Gun*> weapons;
类大脑:公共实体
{
私人:
病媒武器;
以及Brain对象对枪*的所有权

Brain::~Brain()
{
    for (unsigned int i = 0; i < weapons.size(); i++)
    {
        delete weapons[i];
    }
}
Brain::~Brain()
{
for(无符号整数i=0;i
如果一个大脑是复制构建的,那么删除将被多次调用,从不同的武器向量中删除相同的。并且当您添加代理(代理是大脑的派生类)时,会创建一个大脑临时代理,就像在main函数中那样

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;
intmain()
{
级别*级别;
std::载体试剂;
级别=新级别(代理);
对于(int i=0;i<1;i++)
{
//TODO-health在这里是一个毫无意义的参数
Agent.push_back(Agent(100,*级别,Agent,级别->Pickups(),D3DXCOLOR(1.0F,0.4f,0.4f,1.0F));
}
删除级别;
}

如果您为Brain实现复制构造函数来克隆Gun*向量,您应该可以。或者,您应该在向量中使用
shared_ptr
,这样您就不必删除它们

把你的问题归结为

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;
}
class Foo{};
分类栏
{
公众:
Bar()
{
mFooVec.push_back(新Foo());
mFooVec.push_back(新Foo());
}
~Bar()
{
for(无符号整数i=0;i

在这里,x和y条的mFooVec中都有相同的两个Foo*mFooVec

我们需要定义
大脑
。过去的批评不是你没有提供你所拥有的一切,而是你没有以简洁和独立的方式提出问题。仍然不是这样……23813003字节的zip?F我们需要的文件有:
h
cpp
sln
vproj
vcxproj.
,和
suo
。我们不需要的文件有:
ipch
lastbuildstate
manifest
obj
pdb
sdf
log
删除代码e将其减少到67724字节。可管理性更强。下载速度也提高了351倍。我需要从派生析构函数的实现中调用基析构函数吗?不要调用基析构函数。Gun类继承自GameObject。它有虚拟析构函数吗?现在有了,但问题仍然存在。我将更新输出fr在我的问题中关于实体类的调用堆栈。它有虚拟成员吗?和虚拟析构函数吗?所以指针指向所有类中的相同对象。但是也有更多的指针,对吗?它们都指向相同的对象,但在不同的类中实际上有不同的指针,是吗?什么更好?复制构造函数还是共享指针?@SirYakalot:无论是否使用复制构造函数,请使用
std::vector-wearms;
,不要删除
Gun
指针。@sad\u-man你能给我指一些关于共享指针的信息以及为什么不需要删除它们吗?另外,很抱歉,你很难过。@SirYakalot:这是一个智能指针,可以自动删除删除它所拥有的指针。读取
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;
}