我有一个list
指向SomeClass
类中Main
个对象的指针。在Main
中,我可以使用list
和list::begin()
来迭代list::end()
。
当我从SomeClass
的实例执行相同操作时(请记住list
是Main
类的公共成员),我得到以下异常:
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;
}
答案 0 :(得分:2)
0xC0000005: Access violation reading location 0xbaadf0ad.
我认为那是0xbaadf00d
,直到你覆盖了一些东西,这表明未初始化的堆内存。那么,也许你正在取消引用一个不存在的Main*
?例如。如果main->someClasses.begin()
尚未初始化,则main
可能会抛出您的例外
事实上,这是您的代码中的问题。当你在someClass->AFunction();
- 构造函数中时,Main
会调用函数。因此,this
尚未完全有效,因此您无法在AFunction
内使用它。
答案 1 :(得分:1)
只要您保留在Main
构造函数中,this
实例尚未完全初始化!
尝试从其他地方访问实例会导致未定义的行为。这是在这里发生的,因为您正在SomeClass
内访问此未完成的实例。