【问题标题】:This pointer differs from the pointer the methode was called on此指针与调用该方法的指针不同
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多