2016-12-22 4 views
-4

Первый раз при переполнении стека. Я пытаюсь воспроизвести пример, который я нашел в Интернете, для пользовательского безрамного окна с пользовательским заголовком. Вот веб-сайт (я должен был использовать перевод Google, чтобы иметь возможность читать его на английском языке) http://qt.developpez.com/tutoriels/braindeadbzh/customwindow/Получение SIGSEGV

Я бегу ubuntu 16.04, используя создателя QT в качестве моей IDE. У меня последняя версия с 64-разрядной версией.

Я сделал 3.2 и до перехода к 3.3. Я получаю SIGSEGV в строке, где он говорит: Удалить m_Cache;

все компилируется при запуске в отладчике SIGSEGV. Я знаю, что это ошибка вне диапазона, но не знаю почему. Любые предложения или помощь будут оценены наиболее высоко.

Thx заранее!

+1

Скорее всего m_Cache является недопустимым указателем (т.е. он не является NULL, но указывает на ячейку памяти, которая не содержит действительный C++ объект, который был ранее выделенный с новым оператором). Одной из распространенных причин этого является попытка удалить один и тот же объект более одного раза. Другой общей причиной было бы пренебречь инициализацией указателя на допустимое значение (например, NULL или объект, выделенный новым) перед его удалением. –

+1

Я кратко просмотрел этот код - я уверен, что segfault исчезнет, ​​если вы просто инициализировали 'm_Cache' нулевому указателю:' QPixmap * m_Cache = nullptr; ' – qxz

+1

Используйте' valgrind'. – Velkan

ответ

2

m_cache необходимо инициализировать в NULL (nullptr при использовании C++ 11 и выше) в конструкторе, в противном случае он будет оставлен неинициализированным, и первый раз, когда delete m_cache линия будет достигнута она будет пытаться удалить адрес мусора , (обратите внимание, что вызов удаления на указателе NULL/nullptr является действительным, и ничего не делает)

пса: ан français данс ля подробнее:

Внимание: Pensez à инициализатор à NULL ль pointeur m_Cache данс ль CONSTRUCTEUR.

;)

Смежные вопросы