gpt4 book ai didi

c++ - 调试断言失败 - vector 迭代器不可取消引用

转载 作者:行者123 更新时间:2023-11-27 23:23:08 25 4
gpt4 key购买 nike

运行这段代码时出现运行时错误:

void AlienShipManager::Update(float timeDelta, 
BulletManager* bulletManager,
ParticleManager* particleManager,
GameStringSystem* stringBatch)
{
unsigned int i = 0;
while (i < m_alienShipList.size())
{
AlienResult result = m_alienShipList[i].Update(timeDelta, bulletManager);
switch (result)
{
case AlienResult::Dead:
break;
default:
break;
}
++i
}
}

排队

AlienResult result = m_alienShipList[i].Update(timeDelta, bulletManager);

我如何将 AlienShip 添加到 vector 类:

m_alienShipList.push_back(AlienShip(position, speed, m_screeSize, m_alienShipTexture));

如果我有机会也会出现错误:

AlienShip* newAlien = new AlienShip(position, speed, m_screeSize, m_alienShipTexture);
m_alienShipList.push_back(*newAlien);
delete newAlien;

但如果我将其更改为则不会出现:

AlienShip* newAlien = new AlienShip(position, speed, m_screeSize, m_alienShipTexture);
m_alienShipList.push_back(*newAlien);

这会导致巨大的内存泄漏。

这是我的 AlienShip 类的样子:

#pragma once

#include "Body.h"
#include "BulletManager.h"
#include "ParticleManager.h"

enum AliensShipState
{
flying,
dying,
dead,
escaped
};

enum AlienResult
{
No,
Hit,
Dying,
Dead,
Escaped
};

class AlienShip : public Body
{
public:
AlienShip(void);
AlienShip(float2& position, float2& speed, float2* screenSize, ID3D11Texture2D* alienTexture);
~AlienShip(void);

AlienResult Update(float timeDelta, BulletManager* bulletManager);
void Draw(BasicSprites::SpriteBatch^ spriteBatch);

protected:
float m_baseY;
AliensShipState m_state;
float2* m_screenSize;
};

AlienShip 类继承自 Body 类,Body 类内部有 Sprite 类,Body 类内部有另一个 vector 。但由于 Sprite 类在其他地方工作得很好,我不认为它是错误的来源。

我想知道为什么会这样,因为我找不到删除临时对象和损坏 vector 迭代器之间的关系,如果它根本损坏的话。

程序也可以在 Release 中编译和运行,但有一些数据损坏。

我正在使用适用于 Windows 8 的 Visual Studio 2012 Beta。

如果您需要更多源代码,请写信。不幸的是,很难发布所有代码,因为这是一个复杂的程序。

最佳答案

考虑到当您按值将项目添加到 vector 时它不起作用但当您泄漏指针时它起作用,我有 95% 的信心您的 AlienShip 的复制构造函数做了一个浅层的复制,导致你的问题。

编辑:请注意 m_alienShipList.push_back(AlienShip(position, speed, m_screeSize, m_alienShipTexture)); 会导致您的类的拷贝,如果复制构造函数无法正常工作,则会导致问题稍后。

事实上,如果您粘贴的 AlienShip 定义是正确的,那么实际上只有默认的复制构造函数可能会做错事(进一步证明您有自己的析构函数) .

要么实现一个执行深层复制的复制构造函数,要么更好地重写您的类以使用 RAII 为您管理内存,以便默认复制正确。

关于c++ - 调试断言失败 - vector 迭代器不可取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11399294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com