列出迭代器访问冲突

时间:2011-04-27 11:16:05

标签: c++ list access-violation

我有一个list指向SomeClass类中Main个对象的指针。在Main中,我可以使用listlist::begin()来迭代list::end()

当我从SomeClass的实例执行相同操作时(请记住listMain类的公共成员),我得到以下异常:

  

0xC0000005:访问冲突读取位置0xbaadf0ad。

我对来自Python背景的C ++编码相当陌生,所以如果某些事情没有意义,我会道歉。

以下是一个例子:

编辑:主类代码实际上并不在构造函数中,而是在名为InitialiseObjects()的方法中。

编辑:例外来自list::being()方法中的return (iterator(_Nextnode(_Myhead), this));

#include <list>
using namespace std;

class Main
{
public:
    Main::InitialiseObjects()
    {
        // Execution starts here
        SomeClass someClass = new SomClass(this);
        someClasses.push_back(someClass);

        // This works fine
        for (list<SomeClass*>::iterator it = someClasses.begin(); it != someClasses.end(); it++)
            ...

        someClass->AFunction();
    }
    list<SomeClass*> someClasses;
}

class SomeClass
{
public:
    SomeClass::SomeClass(Main *main) : main(main) {}
    void SomeClass::AFunction()
    {
        // This will not work throwing the aformentioned error
        for (list<SomeClass*>::iterator it = main->someClasses.begin(); it != main->someClasses.end(); it++)
            ...
    }
private:
    Main *main;
}

2 个答案:

答案 0 :(得分:2)

0xC0000005: Access violation reading location 0xbaadf0ad.

我认为那是0xbaadf00d,直到你覆盖了一些东西,这表明未初始化的堆内存。那么,也许你正在取消引用一个不存在的Main*?例如。如果main->someClasses.begin()尚未初始化,则main可能会抛出您的例外 事实上,这是您的代码中的问题。当你在someClass->AFunction(); - 构造函数中时,Main会调用函数。因此,this尚未完全有效,因此您无法在AFunction内使用它。

答案 1 :(得分:1)

只要您保留在Main构造函数中,this实例尚未完全初始化

尝试从其他地方访问实例会导致未定义的行为。这是在这里发生的,因为您正在SomeClass内访问此未完成的实例。