0

我用 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();
}

我的应用程序正在使用不同的线程,所以我认为我可能会在其他一些无法正常工作的线程中删除我的对象,但是这个指针不会被更改 - 如果我错了,请告诉我。我不知道这个错误是如何发生的。

谢谢你的帮助。丹尼斯

4

2 回答 2

1

您提供的代码没有任何问题。但我认为答案就在你的问题中:你正在使用多个线程。一旦你有多个线程,你需要检查你的线程模型以及对内存的访问是如何同步的。不幸的是,这取决于您来确定究竟发生了什么,因为问题似乎与此特定代码的编写方式无关。

于 2012-09-01T22:52:38.580 回答
0

这个问题似乎是由于多线程问题。

计算机执行在执行 A 行和 B 行之间稍作休息,最终可能会删除 'o' 指向的对象。

void obj1::func1( obj2* o ){
  o->func2(); //Line A
}

void obj2::func2(){
  this->someCall(); //Line B
}

您将希望找到代码中解构(显式或隐式)对象的所有位置,并确保它们在对象仍被指向时无法删除该对象。

您可以通过使用智能指针或仅通过将对象上的操作与锁同步来强制执行此操作。

于 2012-09-01T23:19:26.480 回答