C ++: этот указатель перезаписан - PullRequest
2 голосов
/ 11 декабря 2010

Пожалуйста, посмотрите на мои исходные файлы, они слишком длинны, чтобы разместить их здесь:

X11Painter.cpp: <a href="http://pastebin.com/gu4SrHUr" rel="nofollow">http://pastebin.com/gu4SrHUr</a>

X11Painter.h: <a href="http://pastebin.com/3ktp1Fvn" rel="nofollow">http://pastebin.com/3ktp1Fvn</a>

Поведениеэтого класса, на мой взгляд, очень странно .

У меня следующий контрольный пример:

#include "X11Painter.h"
int main()
{
    X11Painter p ;
    p.show();
}

Компиляция с помощью строки

g++ -O0 -g -o test2 test2.cpp X11Painter.cpp -lX11 -lXfixes -lXinerama

и просто запустив его, выполните следующие действия:

this->some_test=1234
this->screen:0
1:: this->display='0x8b73008'; this->window='77594625'
width: 3200
0xbff91bdc
this->some_test=1234
this->some_test=3682292
Segmentation fault

Я пытаюсь отобразить окно X11 в X11Painter::show()

Когда я начал исследовать, почему X11Painter.cpp: 83является segfaulting, я обнаружил, что большинство переменных перезаписываются и полностью отличаются в show(), чем они были в конструкторе.

Я положил int some_test, чтобы увидеть, что происходит.Почему, черт возьми, значение меняется?

Если я сделаю printf("%p\n", this), указатель также изменится.Я подозреваю, что где-то указатель this перезаписывается.Но почему это происходит?Отладка с помощью ddd сказала мне, что this-> some_value изменяется прямо при выходе из конструктора.

Выполнение короткого теста с использованием testclass (класса с открытым конструктором, одним открытым методом и одной закрытой переменной) работает без проблем..

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

Может ли это быть связано с библиотеками X11?

Ответы [ 2 ]

12 голосов
/ 11 декабря 2010

В вашем конструкторе без параметров вы делаете это

X11Painter::X11Painter()
{
    X11Painter(-1);
}

Это не делает то, о чем вы думаете, потому что в C ++ нет цепочки конструктора. Код, приведенный выше, создает временный X11Painter объект, вызывая другой конструктор для этого временного объекта, но фактически не инициализируя что-либо в объекте, который вы хотите построить.

Чтобы исправить это, но сохранить то же поведение, удалите ваш конструктор без параметров и в вашем файле .h объявите другой конструктор как

X11Painter(int screenno = -1);

По умолчанию аргумент screenno будет -1, если вы его не предоставите.

1 голос
/ 11 декабря 2010

Это выглядит для меня как повреждение стека, вероятнее всего возникающее из-за

        Window                  window;
        XSetWindowAttributes    winattr;

члены, так как все остальные являются примитивными типами. Например, я заметил это:

    XStoreName(this->display, this->window, "LaserFinger");

Если окно и дисплей не имеют правильного объема памяти, это может пойти kaboom. Однако, не зная библиотек X11, я не смогу оказать вам гораздо большую помощь.

...