我在项目中实现了两个类对象列表。最初,我有一个用于一组类对象的向量容器和一个用于另一组的列表,但刚刚将向量实现转换为列表。
使用向量和列表实现一切正常,但是,当我将向量转换为列表(并更改了所有后续代码)时,当我尝试将对象push_back(或插入)到列表时,我得到一个未处理的异常
PN_test.exe中0x004184e2处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。
结果如下:
在.hpp文件中:
class ssmcSection {
public:
data8* sectStartAddress;
data32 sectSize;
};
std::list<ssmcSection> sections;
在.cpp文件中:
ssmcSection sec0;
sec0.sectStartAddress = memHeadAddress;
sec0.sectSize = 0;
sections.push_back(sec0); //<- DIES IN THIS CALL
列表库中的异常:
void _Insert(const_iterator _Where, const _Ty& _Val)
{ // insert _Val at _Where
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Where._Getcont() != this)
_DEBUG_ERROR("list insert iterator outside range");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
_Nodeptr _Pnode = _Where._Mynode();
_Nodeptr _Newnode =
this->_Buynode(_Pnode, this->_Prevnode(_Pnode), _Val); // <- This is where the exception occurs in the list library
_Incsize(1);
this->_Prevnode(_Pnode) = _Newnode;
this->_Nextnode(this->_Prevnode(_Newnode)) = _Newnode;
}
编辑::显示之前和之后
之前我的班级定义:
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);
这在“sections.push_back(sec0);”失败。它与我使用smmcAllocData列表完全相同...... !! ?? ??
我不明白为什么它与其他列表容器一起使用,但不是这个...列表的所有示例都显示与此相同的用法。 我正在使用MS VS2010。
任何想法? 谢谢!
答案 0 :(得分:0)
嗯...现在可以了!?
我恢复到原始实现(使用向量和列表)并确认它有效。然后我注释掉了所有的矢量代码并慢慢地将其替换为list(通常运行它以确保它仍然在完成转换)直到我替换了所有的矢量代码....
现在一切都像它应该的那样工作。为了确保我不会发疯,我将“破碎的代码”从我原来的帖子中分解为工作代码,以及它的相同!
这是一个奇怪的MS VS问题,或者我遗漏了一些东西。