回调函数内部的接口类导致崩溃
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->dc
之前调用b->callback
。那会是个问题吗?你最好使用成员初始化:
dumbWin(IDumb *dc) : Fl_Window(100, 100, "win"), dc(dc)
另外,为 IDumb 提供一个虚拟析构函数。
【讨论】:
没用。如果我在dumbWin
的构造函数中调用dc->print()
,它就可以工作。只有当我在回调中调用它时,它才会失败!
您能否提供有关它如何崩溃的更多详细信息?什么是调用堆栈?
我刚刚收到segmentation fault (core dumped)
错误。有没有办法查看调用堆栈?我正在使用 Eclipse
你需要在调试器下运行这个东西。我从来没有在eclipse下调试过C++。尝试“调试为”而不是“运行为”。
是的。当在构造函数中调用 dc->print() 时,我尝试单步执行,消息打印正常,但是当从回调中调用 dc->print() 时,它给出了无法访问内存以上是关于回调函数内部的接口类导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章