我正在我的项目中实现两个类对象列表。最初,我有一个用于一组类对象的向量容器和一个用于另一组对象的列表,但刚刚将向量实现转换为一个列表。
向量和列表实现一切正常,但是,当我将向量转换为列表(并更改所有后续代码)时,当我尝试 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。
任何想法??谢谢!