Связывание библиотеки POCO C ++ дает многочисленные утечки памяти - PullRequest
4 голосов
/ 16 июня 2011

Я только начал пытаться интегрировать библиотеку Poco C ++ с нашим игровым движком, однако каждый раз, когда я связываю /usr/lib/libPocoFoundation.so, моя программа внезапно обнаруживает 51 утечку памяти. Удаление опции ссылки избавляет от всех утечек (ни одна из них не из моего кода). Это происходит, даже если я удаляю все Poco #include s из моих файлов c ++.

Я сомневаюсь, что при использовании базовых (основных) методов Poco на самом деле произошла 51 утечка памяти - поиск по их форумам ничего не показал, и я уверен, что другие пользователи заметят что-то такое явное. Я думаю, что это более вероятно проблема с тем, как я связываюсь с Poco?

Я в Ubuntu 11, использую Code :: Blocks для IDE, g ++ 4.5.2 для сборки и получил Poco 1.3.6p1-1build1 из pbu ubuntu (sudo apt-get install libpoco-dev libpoco-doc).

Любые предложения о том, в чем может быть проблема, приветствуются! Единственное, о чем я могу думать, это то, что я неправильно связываю Poco.

Возможно, связано: OP в c-poco-lib-linking-error-when-try-static-linking-vs9-express упоминает что-то о «добавленных флагах препроцессора Foundation_EXPORTS POCO_STATIC PCRE_STATIC» - что будет что делать? На справочных страницах Poco я не вижу никакой информации о том, как правильно связать Poco.

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Вы не говорите, какой инструмент сообщает вам, что у вас есть утечки памяти, но я собираюсь предположить, что это valgrind, так как вы работаете в Ubuntu.

Если утечки происходят, даже если вы не вызываете какие-либо методы POCO, то вполне вероятно, что это одноразовые распределения, происходящие во время статической инициализации библиотеки POCO, которые по какой-либо причине не сносятся позже.

Хотя это не очень хорошее поведение со стороны библиотеки, это не смертельно. Утечки, о которых вам следует беспокоиться, - это те, которые будут повторяться и постепенно будут занимать память.

Я бы рекомендовал использовать valgrind --gen-suppressions=all для генерации подавлений для одноразовых утечек (особенно хорошо, что вы не вызываете какие-либо методы POCO). Затем взгляните на библиотеку POCO и посмотрите, сможете ли вы выяснить, почему эти распределения не отменяются во время .fini. Если вы можете, хорошо, пусть у сотрудников POCO есть ваши исправления, и тогда вы можете снять свои записи подавления. Если нет, оставьте их, чтобы эти «ложные срабатывания» не мешали обнаруживать действительно опасные утечки памяти в вашем коде.

1 голос
/ 22 мая 2015

Некоторые объекты должны быть освобождены путем вызова метода "release"

Ниже приведена выдержка из документа ДоКо

» DOMObject определяет правила для управления памятью в этой реализации DOM. Нарушение этих правил, которые описаны ниже, приводит к утечкам памяти или висящим указателям.

Каждый объект, созданный новым или фабричным методом (например, Document :: create *), должен быть освобожден с вызовом release () или autoRelease (), когда он больше не нужен. «

...