1

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

向量和列表实现一切正常,但是,当我将向量转换为列表(并更改所有后续代码)时,当我尝试 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。

任何想法??谢谢!

4

1 回答 1

0

嗯……现在可以用了!?

我恢复到原始实现(使用向量和列表)并确认它有效。然后我注释掉了所有的向量代码并慢慢地用列表替换它(定期运行它以确保它仍然在完成转换),直到我替换了所有的向量代码......

现在一切都像它应该的那样工作。为了确保我不会发疯,我将原始帖子中的“损坏的代码”与工作代码进行了比较,并且它是相同的!

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

于 2013-07-26T00:00:21.497 回答