【问题标题】: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();
}

【问题讨论】:

    标签: c++ user-interface callback fltk


    【解决方案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() 时,它给出了无法访问内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多