该指针与调用该方法的指针不同

时间:2012-08-13 10:03:17

标签: c++ multithreading pointers

我用C ++编写了一个崩溃的应用程序,因为一个对象方法存储了一个无效的指针!当我调试我的应用程序并查看调用堆栈时,有函数 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();
}

我的应用程序正在使用不同的线程,所以我有一个想法,我在一些其他不能正常工作的线程中删除我的对象,但所以这个指针不会改变 - 请告诉我,如果我是错误。我不知道这个错误会怎么发生。

感谢您的帮助。 丹尼斯

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

计算机执行在执行A行和B行之间需要一段时间,最终可能会删除“o”指向的对象。

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

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

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

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