Ошибка сегментации в моем классе оболочки Xlib (C++)

Я пытаюсь создать класс-оболочку для библиотеки Xlib, но получаю ошибку сегментации! Я новичок в C++, и это, вероятно, не для меня, и, возможно, у меня высокие цели, кроме этой проблемы, может ли кто-нибудь сказать мне, почему я получаю эту ошибку сегментации?
исходный файл
заголовочный файл
main .cpp

Я считаю, что это обратная трассировка, которую я получаю:

Program received signal SIGSEGV, Segmentation fault.
In XMapWindow () (/usr/lib/libX11.so.6)
At /home/elliot/Programming/C and C++/XWindows/src/MyWindow.cpp:49

person Ell    schedule 13.02.2011    source источник
comment
Пожалуйста, не используйте pastebin и его производные на этом сайте. Попробуйте получить обратную трассировку, это очень помогает найти проблему. Вы можете сделать это, скомпилировав свою программу с включенной отладкой (опция -g при использовании g++), а затем запустив ее в отладчике (например, gdb a.out, затем введите run и после сбоя bt, чтобы получить обратную трассировку).   -  person svens    schedule 13.02.2011
comment
ИМХО, pastebin в порядке - код слишком длинный, чтобы копировать и вставлять сюда.   -  person Alnitak    schedule 13.02.2011
comment
Привет, Элл, я новичок, и мне нужно больше информации об обертке Xlib с помощью C++. Как простой пример здесь. Где взять? Спасибо!   -  person sunny2016    schedule 09.09.2013


Ответы (1)


Ваша ошибка указывает на то, что параметры display или window для XMapWindow() были неверными.

Вам необходимо включить в свой код дополнительную проверку ошибок, в частности, для результатов вызовов XOpenDisplay и XCreateWindow.

Единственная очевидная ошибка, которую я вижу, это то, что вы передаете флаг CWBackPixel в XCreateWindow, но оставляете параметр attributes неинициализированным. В отличие от обычного C, C++ не очищает содержимое памяти структур при их объявлении.

EDIT - я, конечно, пропустил действительно ослепительно очевидную ошибку - вы непреднамеренно повторно объявили все переменные-члены ваших классов в своем конструкторе. Это будет ваша проблема масштаба. Вам нужно удалить имена типов из всех назначений в конструкторе, например:

MyWindow::MyWindow()
{   //ctor
    display = XOpenDisplay(NULL);
    visual = XDefaultVisual(display, 0);
    depth = XDefaultDepth(display, 0);
    window = XCreateWindow(display, XRootWindow(display, 0), 0, 0, MyWindow::default_width, MyWindow::default_height, 16, depth, InputOutput, visual, CWBackPixel, &attributes);
    XStoreName(display, window, MyWindow::default_caption.c_str());
    XSelectInput(display, window, ExposureMask | KeyPressMask | KeyReleaseMask);
}
person Alnitak    schedule 13.02.2011
comment
Хм, если я перемещаю XMapWindow(display, window) и всю функцию цикла в конструктор, кажется, что он работает нормально, так что, может быть, это действительно глупая ошибка с моей стороны насчет области видимости переменных? - person Ell; 13.02.2011
comment
Большое спасибо! Вы действительно сделали мой день! Я как раз собирался сдаться! :D - person Ell; 13.02.2011