Ошибка сегментации в классе My Xlib Wrapper (C ++) - PullRequest
1 голос
/ 13 февраля 2011

Я пытаюсь создать класс-оболочку для библиотеки 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

1 Ответ

3 голосов
/ 13 февраля 2011

Ваша ошибка указывает на то, что параметры 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);
}
...