Обертка Qt4 приводит к ошибкам сегментации - PullRequest
1 голос
/ 14 октября 2010

В настоящее время я пишу набор функций-оболочек 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

Любая помощь очень ценится, так как это меня очень озадачило ...

1 Ответ

0 голосов
/ 14 октября 2010

Вызов 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 *).

Я действительно не понимаю, как это будетвызвать ошибки сегментации, так как это должно привести к выделению большего объема памяти, чем необходимо, если только это не является конструктором или каким-либо другим действием от имени этих избыточных элементов массива, которое вызывает вашу проблему.

...