【问题标题】:segmentation fault when i access member variables using a callback function当我使用回调函数访问成员变量时出现分段错误
【发布时间】:2010-07-05 11:40:28
【问题描述】:

我有一个类,我在其中声明了一个静态函数。我将此函数注册为另一个库的回调函数。现在,在这个函数中,我将回调数据取消引用到类指针并调用特定的非静态成员。

调用成功,控件进入非静态成员函数。但是在这个函数内部,当我访问同一个类的成员变量时,我得到了一个分段错误。这很奇怪。谁能帮我解决我可能犯的错误和解决方案?

这是代码的样子。

class test
{
   int count;
   int callback(const char * a, const char *b)
   {
      print(a);
      print(b);
      count++; //// HERE IS WHERE I GET THE SEGMENTATION FAULT
   }

   public:
   static int callbackwrapper(const char*a, const char *b, void *ptr)
   {
      test *p = (test *)ptr; 
      p->callback(a, b);
   }

   test():count(0) {}
   ~test() {}
   Register()
   {
      registercallback(callbackwrapper);
   }
}

【问题讨论】:

  • 如何调用回调?
  • 传入回调封装的指针是否有效?
  • 我看不到您如何为第三方库提供有效的 ptr。

标签: c++ callback


【解决方案1】:

传递给callackwrapperptr 很可能是无效指针或不是test 类的对象。调用仍然成功,因为只要您不访问成员变量,类方法就与普通 C++ 函数相同。您访问count 的位置是您实际取消引用对象的位置,因此会出现分段错误。

【讨论】:

    【解决方案2】:

    停止使用 void*s。你会给自己带来很多麻烦。

    您可能正在对无效对象调用 callback()。我无法从你给出的例子中看出,但这就是我的感觉。我需要查看 registercallback() 的实现来确定,但我注意到 callbackwrapper() 不是静态函数,因此调用它就好像它是一个静态函数(我怀疑可能是这种情况)会发生各种破坏。

    【讨论】:

      【解决方案3】:
      int callbackwrapper(const char*a, const char *b, void *ptr)
      {
        test *p = (test *)ptr; 
        p->callback(a, b);
      }
      

      是一个成员函数。该成员函数正在寻找对其所属对象的引用。也就是说,上面的函数在幕后变成了这样:

      int callbackwrapper(test* this, const char*a, const char *b, void *ptr)
      {
        test *p = (test *)ptr; 
        p->callback(a, b);
      }
      

      很可能 registercallback 在这里不需要成员函数。

      您可以通过将callbackwrapper 设为静态成员函数来解决此问题:

      static int callbackwrapper(const char*a, const char *b, void *ptr)
      {
        test *p = (test *)ptr; 
        p->callback(a, b);
      }
      

      另外,不要忘记:如果您正在与 C 库交互,这就是您需要回调的原因,请记住,从 C 调用的函数需要声明为 extern "C",这将强制你将该函数移出类,并使其实现

      extern "C" int callbackwrapper(const char*a, const char *b, void *ptr)
      {
        test *p = (test *)ptr; 
        p->callback(a, b);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        相关资源
        最近更新 更多