C++ 列表推回C+期间未处理的异常+;

C++ 列表推回C+期间未处理的异常+;,c++,list,exception,C++,List,Exception,我在我的项目中实现了两个类对象列表。最初,我有一个用于一组类对象的向量容器和一个用于另一组对象的列表,但刚刚将向量实现转换为一个列表 向量和列表实现的一切都很好,但是,当我将向量转换为列表(并更改了所有后续代码)时,当我尝试将对象推回(或插入)列表时,会出现一个未处理的异常 PN_test.exe中0x004184e2处未处理的异常:0xC0000005:访问冲突读取位置0x00000004 这是由以下原因造成的: 在.hpp文件中: class ssmcSection {

我在我的项目中实现了两个类对象列表。最初,我有一个用于一组类对象的向量容器和一个用于另一组对象的列表,但刚刚将向量实现转换为一个列表

向量和列表实现的一切都很好,但是,当我将向量转换为列表(并更改了所有后续代码)时,当我尝试将对象推回(或插入)列表时,会出现一个未处理的异常

PN_test.exe中0x004184e2处未处理的异常:0xC0000005:访问冲突读取位置0x00000004

这是由以下原因造成的:

在.hpp文件中:

    class ssmcSection {

        public:
            data8* sectStartAddress;
            data32 sectSize;
    };

std::list<ssmcSection> sections;
所有这些都很有效。以下显示了更改:

我的班级定义如下:

class SMMC {

    public:
        ...

    class ssmcSection {

        public:
            data8* sectStartAddress;
            data32 sectSize;
    };

    class smmcAllocData {

        public:
        bool allocated;
        data8* start;
        data8* end;
        data32 sectionNum;
    };

    private:
    std::list<smmcAllocData> memMap; 
        std::list<ssmcSection> sections; //changed from vector to list
};
ssmcSection sec0;
sec0.sectStartAddress = memHeadAddress;
sec0.sectSize = 0;
sections.push_back(sec0);

...

smmcAllocData newSec;
newSec.allocated = true;
newSec.start = memHeadAddress;
newSec.end = memHeadAddress + spaceRequested;
newSec.sectionNum = sections.size()-1;
memMap.push_back(newSec);
此操作在“sections.push_back(sec0);”处失败。这与我使用smmcAllocData列表所做的完全相同

我不明白为什么它和其他列表容器一起工作,但不是这个。。。列表的所有示例都显示了与此相同的用法。 我正在使用MS VS2010

有什么想法吗?? 谢谢

Hmmm。。。现在可以用了

我返回到最初的实现(使用一个向量和一个列表),并确认它是有效的。然后我注释掉了所有的向量代码,并慢慢地用list替换它(定期运行它以确保它在整个转换过程中仍然有效),直到我替换了所有的向量代码

现在一切都正常运转了。为了确保我没有发疯,我将“坏代码”从我的原始帖子中区分为工作代码,这是一样的


要么这是一些奇怪的MS VS问题,要么我遗漏了一些东西

提供类ssmcSection的定义-至少是构造函数和析构函数,因为list::push_back()将复制要推回的内容。根据我的经验,“访问冲突读取”通常与访问无效点有关,因为ssmcSection类的定义中包含了无效点。它是最基本的,没有任何方法。构造函数和析构函数只是默认值。它基本上是一个结构。这个头包含在多个.cpp文件中吗?为什么不在调用sections.push_back(sec0)之前设置一个断点;检查是否有空指针?你的应用程序是多线程和访问部分的吗?我设置了断点,并跟踪执行到push_-back调用。一切看起来都很好,都很明确。它不是多线程应用程序,因此不存在争用情况。头文件包含在类实现的.cpp和main.cpp中
class SMMC {

    public:
        ...

    class ssmcSection {

        public:
            data8* sectStartAddress;
            data32 sectSize;
    };

    class smmcAllocData {

        public:
        bool allocated;
        data8* start;
        data8* end;
        data32 sectionNum;
    };

    private:
        std::list<smmcAllocData> memMap; 
        std::vector<ssmcSection> sections;
};
ssmcSection sec0;
sec0.sectStartAddress = memHeadAddress;
sec0.sectSize = 0;
sections.push_back(sec0);

...

smmcAllocData newSec;
newSec.allocated = true;
newSec.start = memHeadAddress;
newSec.end = memHeadAddress + spaceRequested;
newSec.sectionNum = sections.size()-1;
memMap.push_back(newSec);
class SMMC {

    public:
        ...

    class ssmcSection {

        public:
            data8* sectStartAddress;
            data32 sectSize;
    };

    class smmcAllocData {

        public:
        bool allocated;
        data8* start;
        data8* end;
        data32 sectionNum;
    };

    private:
    std::list<smmcAllocData> memMap; 
        std::list<ssmcSection> sections; //changed from vector to list
};
ssmcSection sec0;
sec0.sectStartAddress = memHeadAddress;
sec0.sectSize = 0;
sections.push_back(sec0);

...

smmcAllocData newSec;
newSec.allocated = true;
newSec.start = memHeadAddress;
newSec.end = memHeadAddress + spaceRequested;
newSec.sectionNum = sections.size()-1;
memMap.push_back(newSec);