2013-04-16 5 views
0

У меня есть серверное приложение (с QTcpServer). Проверка утечки памяти VLD показывает отсутствие утечек памяти. , но когда я отправляю команды от клиента к серверу, диспетчер задач показывает прирост памяти. , так что у сервера закончится память. Как я могу найти части кода, которые вызывают такую ​​проблему? спасибоКакая часть кода увеличивает использование памяти?

+1

'malloc()' и 'operator new' особенно хороши в распределении памяти, особенно в сочетании с отсутствием' free() 'и' delete' соответственно. – 2013-04-16 06:06:11

+0

Большинство объектов Qt имеют родительские объекты. любой объект, удаляет его детей. поэтому нет утечки памяти. но некоторые, где в коде, какой-то родительский объект остается живым во время работы сервера и просто удаляется, когда сервер закрывается. поэтому память увеличивается. – alirakiyan

+0

«Некоторые родительские объекты остаются живыми во время работы сервера и просто удаляются при закрытии сервера». Вы имеете в виду ** вы ** не удаляете его. – cmannett85

ответ

1

Заполните эти вопросы, и я думаю, что я буду в состоянии помочь вам:

  • памяти увеличивается, когда клиент подключается? Y/N
  • Память уменьшается, когда клиент отключается? Y/N
  • После того, как 3 клиента подключились/отключились, вы на холостом ходу, увеличилась ли память?
  • Подключение к 1 клиенту, отправка команд и разъединение. Увеличена ли память?

Если последнее было ДА, попробуйте изолировать команду, которая увеличивает память.
Если все команды увеличивают использование памяти, то код, обрабатывающий диспетчер команд, протекает.
Если только 1 команда протекает, тогда эта команда протекает.

Общие вопросы:

  • вы указать родителя для каждого Qt объекта вы выделяете с помощью new и что вы делаете не бесплатно delete? Если нет, это ваша утечка.
  • Вы используете QList или QHashMap? Если да проверить, что ваш ясный/убирать их при необходимости

В самом последнем, вы можете попробовать и использовать HP Garbage collector на не-QT объектов, которые вы размещаете.

+0

Спасибо.Я не создаю все объекты Qt только с одним родителем. Но вы правы, я должен указать, протекает ли одна команда, или все команды. Я думаю, что я должен отслеживать код за строкой. еще раз спасибо. – alirakiyan

2

При выполнении «работы» при принятии клиента, очевидно, ваше использование памяти будет расти. Важно то, что, когда вы закончите работу, вы освобождаете объекты, которые вы выделили. Если это производные объекты QObject, Qt будет отслеживать и удалять их при выходе программы, так что на самом деле не будет обнаружены утечки памяти, но если вы не удалите их во время работы вашего сервера, они просто останутся там.

Вы можете сделать несколько вещей, чтобы уменьшить использование памяти, например, не создавать объекты в куче, но в стеке (эти объекты автоматически исчезнут) попробуйте использовать как можно меньше выделенных ресурсов памяти, освободите выделенная память сразу вам не нужна, и т. д.

Возможно, поделившись некоторым кодом (если он не слишком огромен), мы сможем определить несколько моментов, которые мы можем улучшить в отношении использования памяти.

+0

Да. и спасибо. Я знаю и принимаю то, что вы говорите. Теперь, есть ли какой-либо инструмент для использования для такой проблемы? – alirakiyan

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