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