gpt4 book ai didi

c++ - Qt4 Wrapper 导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:38 27 4
gpt4 key购买 nike

我目前正在为一个应用程序编写一组 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_newgui_application_exec)之后,应用程序仍然会崩溃,但是在 gui_application_exec 中。

使用 gdb 运行二进制文件的输出:http://codepad.org/wBifH1B2

来源:http://dl.dropbox.com/u/863332/wrapper.tar.bz2

非常感谢任何帮助,因为这让我很困惑......

最佳答案

对 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 *) 的数组。

我真的不明白这会如何导致段错误,因为它会导致分配的内存比需要分配的内存更大,除非是构造函数或代表这些多余数组成员的其他操作导致了您的问题.

关于c++ - Qt4 Wrapper 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com