向向量添加2个以上的对象时遇到问题

时间:2015-02-24 14:19:14

标签: c++ vector

我正在进行一个Parallax滚动项目,我需要在屏幕上同时获得多个精灵。为此,并使代码可远程重用,我使用一些向量来保存我的ParallaxSegment对象。

ParallaxSegment* seg;
vector<ParallaxSegment> parsega;

这些是在我的主Game类中创建的私有成员。后来,在Game的构造函数中,我有这个:

Game::Game() : Scene("Game"),
    m_Logo(nullptr),
    seg(nullptr),
    m_Timer(0.0f)
{
    seg = new ParallaxSegment("Leaves1@2x", 1334);
    parsega.push_back(*seg);

    seg = new ParallaxSegment("Leaves2@2x", 1334);
    parsega.push_back(*seg);

    seg = new ParallaxSegment("Leaves3@2x", 1334);
    parsega.push_back(*seg);

    seg = new ParallaxSegment("Leaves4@2x", 1334);
    parsega.push_back(*seg);
}

ParallaxSegments似乎创建得很好,而push_back适用于前两种用途。但是,在第三次使用它时,我收到以下错误:

Unhandled exception at 0x003EED82 in GameDev2D.exe: 0xC0000005: Access violation reading location 0x0000001C.

并被重定向到Sprite的解构函数,ParallaxSegment继承自:

Sprite::~Sprite()
{
    //Set the shader to null
    m_Shader = nullptr;

    //Cycle through and delete all the frames in the sprite
    for(unsigned int i = 0; i < m_Frames.size(); i++)
    {
        delete m_Frames.at(i); //This line, specifically, is where the program terminates
        m_Frames.at(i) = nullptr;
    }

    m_Frames.clear();
}

我尝试使用Sprites而不是稍微修改过的ParallaxSegment类,但问题仍然存在,我被带回了同一个地方。我是否在使用push_back函数做错了什么?我创建新的Sprites错了吗?我应该在制作新的之前删除它们吗?

1 个答案:

答案 0 :(得分:0)

vector<ParallaxSegment> parsega;
[...]
ParallaxSegment* seg = new ParallaxSegment(...);
parsega.push_back(*seg);

你的矢量没有指向ParallaxSegments,但是真实的&#39; ParallaxSegment对象。因此,您创建一个指向ParallaxSegment对象的指针,取消引用它以将对象存储在向量中。这太复杂了。

但请记住:你的矢量包含对象,而不是指针。因此,您无法调用&#39;删除m_Frames.at(i)&#39;,因为您尝试删除对象而不是指针。发生访问冲突时的情况。