我目前正在为一个应用程序编写一组Qt4的包装函数作为插件(因为我个人认为在普通C中编写扩展更容易实现)。
起初我可以通过简单地抽象以下内容来完成:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication* app = new QApplication(argc, argv);
QPushButton* hello = new QPushButton("Hello world!");
hello->resize(500, 300);
hello->show();
return app->exec();
}
进入这个(事实上,这是我的包装器的main.c中的代码):
#include "bind.h"
int main(int argc, char* argv[])
{
gui_application_t* app;
gui_pushbutton_t* hello;
app = gui_application_new(argc, argv);
hello = gui_pushbutton_new("Hello World");
gui_pushbutton_resize(hello, 100, 30);
gui_pushbutton_show(hello);
return gui_application_exec(app);
}
虽然前者有效(正如预期的那样),但我在后者的明显随机位置会出现分段错误。我希望我的版本会和前者一样......但我担心它根本不会: - (
运行二进制文件后,输出通常为:
*** GUI Debug: gui_application_new: ctx->app = hex_addr
*** GUI Debug: gui_pushbutton_new: ctx->button = hex_addr
*** GUI Debug: gui_pushbutton_resize: ctx->button = hex_addr
*** GUI Debug: gui_pushbutton_show: ctx->button = hex_addr
Segmentation fault
但是,即使删除了对gui_pushbutton_*
的调用(并且只调用gui_application_new
和gui_application_exec
),应用程序仍会崩溃,但在gui_application_exec
。
使用gdb运行二进制文件的输出:http://codepad.org/wBifH1B2
资料来源:http://dl.dropbox.com/u/863332/wrapper.tar.bz2
非常感谢任何帮助,因为这让我非常困惑......
答案 0 :(得分:0)
调用gui_allocate:
ctx = gui_allocate<gui_pushbutton_t>(sizeof(gui_pushbutton_t*));
表明该函数的工作方式与malloc
类似,并采用请求的大小并将地址返回给该大小的缓冲区,但事实并非如此。这是一个模板编辑的函数,它的每个版本都知道类型。它实际上更像是calloc
而不是malloc,因为调用:
ctx = gui_allocate<gui_pushbutton_t>(1);
会为一个gui_pushbutton_t
分配足够的空间。 gui_allocate
的参数是数组长度,而不是元素大小。
您正在分配长度为sizeof(gui_pushbutton_t *)
的数组。
我真的没有看到它会如何导致分段错误,因为它应该导致比分配所需的更大的内存,除非它是构造函数或代表这些多余数组成员的其他操作导致您的问题