我正在进行一个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错了吗?我应该在制作新的之前删除它们吗?
答案 0 :(得分:0)
vector<ParallaxSegment> parsega;
[...]
ParallaxSegment* seg = new ParallaxSegment(...);
parsega.push_back(*seg);
你的矢量没有指向ParallaxSegments,但是真实的&#39; ParallaxSegment对象。因此,您创建一个指向ParallaxSegment对象的指针,取消引用它以将对象存储在向量中。这太复杂了。
但请记住:你的矢量包含对象,而不是指针。因此,您无法调用&#39;删除m_Frames.at(i)&#39;,因为您尝试删除对象而不是指针。发生访问冲突时的情况。