【发布时间】:2012-08-13 10:03:17
【问题描述】:
我用 C++ 编写了一个应用程序,它有时会崩溃,因为对象方法存储了无效的 this 指针!当我调试我的应用程序并查看调用堆栈时,有函数func1,下面是func2。在第一个函数中,指针是有效的,但在第二个函数中,this 指针应该与第一个函数中的指针具有相同的地址,this 指针指向一些无效的内存地址:
void obj1::func1( obj2* o ){
//Pointer o is valid and correctely initialized when i debug my Application
o->func2();
}
void obj2::func2(){
//Here i do a call on the this pointer. The this pointer is invalid and so my
//Application is crashing. How can i have a different this pointer then the
//pointer i was calling on. I can't imagine how this can happen.
this->someCall();
}
我的应用程序正在使用不同的线程,所以我认为我可能会在其他一些无法正常工作的线程中删除我的对象,但不会更改 this 指针 - 请告诉我我是否错误的。我不知道这个错误是怎么发生的。
感谢您的帮助。 丹尼斯
【问题讨论】:
-
这可能是 func1 中某处的堆栈损坏。
-
你能告诉我们
obj1和obj2的类接口的相关部分吗?你为什么叫它this->someCall()而不是someCall()。obj2是否派生自其他类? -
请提供编译并显示您遇到的问题的最小源代码。
-
@rhalbersma 我并没有真正调用 this->someCall() 但 this->obj3->someCall() - 我只是简化了问题,因为问题是 this 指针。
-
如果您的代码没有未定义的行为,或者您的编译器有错误,则不会发生这种情况。如果你能重现问题,你应该能够系统地从系统中删除代码,直到你有一个最小的测试用例(这是你必须做的工作)。那么如果你仍然不明白为什么你的代码失败了,你可以给我们这个最小的测试用例,它应该包含足够的信息让我们说“你有未定义的行为那里”,或“您的编译器肯定有错误”。如果没有最小的测试用例,这个问题是不可能正确回答的。
标签: c++ multithreading pointers