Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调试断言失败-向量迭代器不可取消引用_C++_Vector - Fatal编程技术网

C++ 调试断言失败-向量迭代器不可取消引用

C++ 调试断言失败-向量迭代器不可取消引用,c++,vector,C++,Vector,我在运行此代码时遇到此运行时错误: void AlienShipManager::Update(float timeDelta, BulletManager* bulletManager, ParticleManager* particleManager, GameStringSystem* stringBatch) { unsigned int i = 0; while (i < m_alienShipList.size(

我在运行此代码时遇到此运行时错误:

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 
    }
}
下面是我如何将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* 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类,Sprite类中包含另一个向量。 但由于Sprite类在其他地方工作得很好,我不认为这是错误的根源

我想知道为什么会发生这种情况,因为我找不到删除临时对象和损坏向量迭代器之间的关系,如果它损坏了的话

该程序也会编译并在发行版中运行,但会导致一些数据损坏

我正在使用Visual Studio 2012 Beta for Windows 8

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

考虑到在按值将项添加到向量时它不起作用,但在泄漏指针时却起作用,我有95%的信心,您的
AlienShip
复制构造函数会进行浅层复制,从而导致您的问题

编辑:注意
m_alienShipList.向后推(AlienShip(位置、速度、m_screeSize、m_alienShipTexture))会导致类的副本,如果副本构造函数不能正常工作,则会在以后导致问题

事实上,如果你粘贴的
AlienShip
定义是正确的,那么实际上只有默认的复制构造函数可能做了错误的事情(因为你有自己的析构函数)


实现一个执行深度复制的复制构造函数,或者更可取的做法是重写类以使用RAII为您管理内存,从而使默认副本正确无误。

假设在按值将项添加到向量时它不起作用,但在泄漏指针时会起作用,我有95%的信心,您的
AlienShip
复制构造函数会进行浅复制,从而导致您的问题

编辑:注意
m_alienShipList.向后推(AlienShip(位置、速度、m_screeSize、m_alienShipTexture))会导致类的副本,如果副本构造函数不能正常工作,则会在以后导致问题

事实上,如果你粘贴的
AlienShip
定义是正确的,那么实际上只有默认的复制构造函数可能做了错误的事情(因为你有自己的析构函数)


实现一个执行深度复制的复制构造函数,或者更可取的做法是重写类以使用RAII为您管理内存,从而使默认副本正确。

您发布的代码肯定不是原始代码。有一个
丢失,不应编译。您似乎不了解一些基本的
C++
概念,如内存管理和值语义。另外,这看起来像C++ +CLI.<代码>基本精灵::SpReTePalpA{Lo/Cuth>不是C++。这些症状表明“三的规则”违反了 Reavigs类中的某个地方,但是从代码中看不到。我已经删除了一些在Switter语句中不使用任何向量的代码。“^”是windows 8中最新的“Microsoft C++”中的符号,AlienShip不需要析构函数或任何树,因为唯一的指针应指向同一位置,并且不应删除。Howewer,我同意我不理解C++中的一些内容,因为我只写了半年,你发布的代码肯定不是原来的。有一个
丢失,不应编译。您似乎不了解一些基本的
C++
概念,如内存管理和值语义。另外,这看起来像C++ +CLI.<代码>基本精灵::SpReTePalpA{Lo/Cuth>不是C++。这些症状表明“三的规则”违反了 Reavigs类中的某个地方,但是从代码中看不到。我已经删除了一些在Switter语句中不使用任何向量的代码。“^”是windows 8中最新的“Microsoft C++”中的符号,AlienShip不需要析构函数或任何树,因为唯一的指针应指向同一位置,并且不应删除。Howewer我同意我不理解C++基础参数中的一些东西,因为我只在半个年头编程它,谢谢你,我会为它做一个拷贝构造函数和析构函数。但我仍然不明白为什么我只是在做m_alienShipList时它不起作用;虽然push_back不会导致复制构造函数启动(我想只是一个普通的复制构造函数)。现在我很确定这就是问题所在。如果有帮助的话,我现在就告诉你,当我添加一个副本构造函数时,它起作用了。很抱歉我忘了一条非常重要的规则,三人帮谢谢,我将为它创建一个副本构造函数和析构函数。但我仍然不明白为什么我只是在做m_alienShipList时它不起作用;虽然push_back不会导致复制构造函数启动(我想只是一个普通的复制构造函数)。现在我很确定这就是问题所在。如果有帮助的话,我现在就告诉你,当我添加一个副本构造函数时,它起作用了。很抱歉我忘了一条很重要的规则,“三人帮”