向矢量添加超过 2 个对象时遇到问题
Having trouble adding more than 2 objects to a vector
我正在做一个视差滚动项目,我需要同时在屏幕上显示多个精灵。为此,并使代码可远程重用,我使用一些向量来保存我的 ParallaxSegment 对象。
ParallaxSegment* seg;
vector<ParallaxSegment> parsega;
这些是在我的主游戏 class 中创建为私人会员的。后来,在游戏的构造函数中,我有这个:
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 class,但问题仍然存在,我又回到了同一个地方。 push_back 函数我做错了吗?我是否错误地创建了新的 Sprites?我应该在制作新的之前删除它们吗?
vector<ParallaxSegment> parsega;
[...]
ParallaxSegment* seg = new ParallaxSegment(...);
parsega.push_back(*seg);
您的矢量不包含指向 ParallaxSegment 的指针,而是 'real' ParallaxSegment 对象。因此,您创建了一个指向 ParallaxSegment 对象的指针,取消引用它以将对象存储在向量中。这是'too complicated'。
但请记住:您的矢量包含对象,而不是指针。因此你不能调用 'delete m_Frames.at(i)',因为你试图删除一个对象而不是一个指针。那就是发生访问冲突的时候。
我正在做一个视差滚动项目,我需要同时在屏幕上显示多个精灵。为此,并使代码可远程重用,我使用一些向量来保存我的 ParallaxSegment 对象。
ParallaxSegment* seg;
vector<ParallaxSegment> parsega;
这些是在我的主游戏 class 中创建为私人会员的。后来,在游戏的构造函数中,我有这个:
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 class,但问题仍然存在,我又回到了同一个地方。 push_back 函数我做错了吗?我是否错误地创建了新的 Sprites?我应该在制作新的之前删除它们吗?
vector<ParallaxSegment> parsega;
[...]
ParallaxSegment* seg = new ParallaxSegment(...);
parsega.push_back(*seg);
您的矢量不包含指向 ParallaxSegment 的指针,而是 'real' ParallaxSegment 对象。因此,您创建了一个指向 ParallaxSegment 对象的指针,取消引用它以将对象存储在向量中。这是'too complicated'。
但请记住:您的矢量包含对象,而不是指针。因此你不能调用 'delete m_Frames.at(i)',因为你试图删除一个对象而不是一个指针。那就是发生访问冲突的时候。