LINUX.ORG.RU

Как найти в qt проекте утечку памяти ?

 , , , ,


0

2

С помощью DebugDiag получаю крэшдамп со стек трейсом падения. По стеку определил, что падает из-за нарушения указателя переменной. В коде используется что-то типа

QList<MyClass *> * mylist
В какой-то момент по адресу переменной mylist вместо нормального адреса в дебагере qt вижу что-то типа 0xcdcdcdcd. И прога падает при первом обращении после повреждения указателя к этой переменной. Как найти где рушится этот указатель в коде, а также можно ли после этого штатно проверить, что он кривой и не дать ей упасть при обращении ? Проект довольно большой и достался от другого прогера, который уволился) Само повреждение указателя случается не регулярно, а к примеру может через 5 минут, может через пару часов упасть.

Ответ на: комментарий от Marvel

Да, но вопрос откуда это посреди работы кода. Этот указатель на старте инициализируется и дальше после его наполнения только читается прогой для анализа. В какой-то момент на анализе он вот так 0xcdcdcdcd становится, как бы поймать где это происходит. Заметил, что если убирать qDebug по коду, то падает значительно реже.

user2132 ★
() автор топика
Ответ на: комментарий от user2132

Копай в сторону неинициализированной памяти. Вот пример кода, который выводит CDCDCDCD в MS Visual Studio

#include <iostream>
#include <memory>

struct A {
    int * p;
};

int main()
{
    auto * a = new A;
    std::cout << a->p << std::endl;
    return 0;
}
Marvel
()
Ответ на: комментарий от RazrFalcon

Согласен, что не нужен. Я QList * никогда сам не использовал. Но в этой проге через сигналы этот указатель посылается в кучу других классов для обработки. Видимо поэтому был выбран указатель на QList.

user2132 ★
() автор топика
Ответ на: комментарий от RazrFalcon

Также вопрос как правильно передавать QList без указателя в другой слот по значению или его адрес, если сделать без указателя объявление.

user2132 ★
() автор топика
Ответ на: комментарий от user2132

слот может добавлять в QList объекты

Странная архитектура, ну да ладно. У тебя косяк с временем жизни объектов. Это нужно устранять, чтобы QList жил дольше объекта, в котором находится слот. Как костыль можно использовать не сырой указатель, а std::shared_ptr.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

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

user2132 ★
() автор топика
Ответ на: комментарий от user2132

А я правильно понимаю, что самое простое в этом чужом проекте убрать указатели в QList и сделать его просто объектом

Зависит от проекта. Если изменения в QList должны быть видимы для других частей кода, или в нем хранится большой массив данных и указатель при этом неконстантный, то так сделать не получится

annulen ★★★★★
()
Ответ на: комментарий от ox55ff

Как костыль можно использовать не сырой указатель, а std::shared_ptr.

Тогда можно получить утечку памяти, только не как в названии темы, а настоящую

annulen ★★★★★
()
valgrind --tool=memcheck --leak-check=yes --track-origins=yes --leak-check=full --show-leak-kinds=all ./your_qt_app

либо

-fsanitize=address -fstack-protector-all -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=leak
для QMAKE_CFLAGS/QMAKE_CXXFLAGS/QMAKE_LFLAGS и запускай
LD_PRELOAD=/path/to/libasan.so ./your_qt_app

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от RazrFalcon

В смысле, не нужен? Откуда такая уверенность? Может, он невладеющий?

next_time ★★★★★
()

советую начать с cppcheck по проекту, потом valgrind, да

next_time ★★★★★
()
Ответ на: комментарий от ox55ff

по этому поводу документации не доверяйте: там в списке QString, например, который в действительности implicit sharing не поддерживает, во всяком случае, в версии 4.6, на которой я проверял

next_time ★★★★★
()
Ответ на: комментарий от user2132

нет, т.к.

Вообще-то доступ нужен, так как слот может добавлять в QList объекты.

next_time ★★★★★
()
Ответ на: комментарий от next_time

Так в 4.6 и не заявлялась такая фича, это фишка 5-й кути.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.