Защита приложения от утечек из библиотеки - PullRequest
2 голосов
/ 04 февраля 2011

Мне нужно использовать функцию из разделяемой библиотеки, которая теряет небольшой объем памяти (допустим, я не могу изменить библиотеку).К сожалению, мне приходится вызывать эту функцию огромное количество раз, что, очевидно, делает эту утечку катастрофической.

Есть ли способ решить эту проблему?Если да, есть ли быстрый способ сделать это?(Функция должна вызываться несколько сотен тысяч раз, утечка становится проблематичной примерно через 10 тысяч раз)

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Я могу придумать пару подходов, но я не знаю, что будет работать для вас.

  • Переключиться на распределитель памяти для сбора мусора, например Boehm's gc.Это может сгладить эти утечки и даже может привести к увеличению производительности, поскольку free() становится недоступным.

  • exit(): окончательный распределитель ресурсов.Отключите подпроцесс, запустите его 10 000 раз, передайте результаты обратно в родительский процесс.Веб-сервер Apache делает это для защиты от утечек из сторонних библиотек.

3 голосов
/ 04 февраля 2011

Я не уверен, что это проще, чем переписывать функцию самостоятельно, но вы могли бы написать свой собственный небольшой распределитель памяти, специфичный для вашей задачи, который бы выглядел несколько следующим образом:

(он должен заменить вызовы выделения памяти по умолчанию, и это также делается для функций в вашей библиотеке).

1) У вас должна быть возможность войти в режим восстановления утечки , который, например, удаляет все, что выделено в этом режиме.

2) Прежде чем ваша функция что-то обработает, введите этот режим устранения утечек и выйдите из него после завершения функции.

В принципе, если зависимости в вашем коде не слишком тесны, это поможет.


Другим способом было бы создать другое приложение и связать его с основным. Когда выходит второй, память будет автоматически уничтожена. Возможно, вы захотите посмотреть, как googletest framework выполняет свой дочерний тест и как там строятся каналы.

0 голосов
/ 04 февраля 2011

Короче, нет. Если у вас есть время, вы можете переписать функцию самостоятельно. Катастрофический обычно означает, что это путь. Еще одна возможность, вы можете загрузить и выгрузить библиотеку (например, .so)? Возможно, это освободит утечку памяти.

...