回调函数内部的接口类导致崩溃

Posted

技术标签:

【中文标题】回调函数内部的接口类导致崩溃【英文标题】:Interface class inside callback function causes crash 【发布时间】:2014-01-08 13:55:34 【问题描述】:

代码非常简单。如果没有IDumb 并且我将dumbClass 直接传递给dumbWin,则代码有效。但是当dumbClass有IDumb接口时,代码在print()处崩溃。

using namespace std;

class IDumb 
public :
virtual void print() = 0;
;

class dumbClass : public IDumb 
public :
void print() 
    cout << "this is dumb class" << endl;

;

class dumbWin : public Fl_Window 
IDumb *dc;
public:
dumbWin(IDumb *dc) : Fl_Window(100, 100, "win") 
    Fl_Button *b = new Fl_Button(10, 10, 50, 25, "OK");
    b->callback((Fl_Callback*)callbk, this);
    end();

    this->dc = dc;


void print() 
    dc->print();


static void callbk(void *p) 
    cout << "OK" << endl;
    ((dumbWin*)p)->print();

;

int main(int argc, char **argv)

IDumb *dC = new dumbClass();
dumbWin *dW = new dumbWin(dC);
dW->show();

return Fl::run();

【问题讨论】:

【参考方案1】:

在设置this-&gt;dc 之前调用b-&gt;callback。那会是个问题吗?你最好使用成员初始化:

dumbWin(IDumb *dc) : Fl_Window(100, 100, "win"), dc(dc) 

另外,为 IDumb 提供一个虚拟析构函数。

【讨论】:

没用。如果我在dumbWin 的构造函数中调用dc-&gt;print(),它就可以工作。只有当我在回调中调用它时,它才会失败! 您能否提供有关它如何崩溃的更多详细信息?什么是调用堆栈? 我刚刚收到segmentation fault (core dumped) 错误。有没有办法查看调用堆栈?我正在使用 Eclipse 你需要在调试器下运行这个东西。我从来没有在eclipse下调试过C++。尝试“调试为”而不是“运行为”。 是的。当在构造函数中调用 dc->print() 时,我尝试单步执行,消息打印正常,但是当从回调中调用 dc->print() 时,它给出了无法访问内存

以上是关于回调函数内部的接口类导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

快速向类函数添加回调

异步回调函数

在类内部处理回调时必须调用对非静态成员函数的引用

回调函数的应用

内部嵌套回调函数中调用未定义的对象

内部嵌套回调函数中调用未定义的对象