Добавление счетчиков к отдельным классам обсуждалось в некоторых ответах. Однако для этого требуется выбрать классы для подсчета и изменить их тем или иным образом. Далее предполагается, что вы добавляете такие счетчики для поиска ошибок, при которых сохраняется больше объектов определенных классов, чем ожидалось.
Кратко повторим некоторые уже упомянутые вещи: для реальных утечек памяти, безусловно, есть valgrind:memcheck и дезинфицирующие средства для утечек. Однако для других сценариев без реальных утечек они не помогают (неочищенные векторы, записи карты с никогда не доступными ключами, циклы shared_ptrs, ...).
Но, так как об этом не упоминалось: В наборе инструментов valgrind также есть массив, который может предоставить вам информацию обо всех кусках выделенной памяти и о том, где они были выделены. Однако давайте предположим, что valgrind:massif также не подходит для вас, и вам действительно нужны подсчеты экземпляров.
В целях случайного поиска ошибок - если вы открыты для какого-то хакерского решения и если вышеперечисленные варианты не работают - вы можете рассмотреть следующее: В настоящее время многие объекты в куче эффективно удерживаются интеллектуальными указателями. Это могут быть классы интеллектуальных указателей из стандартной библиотеки или классы интеллектуальных указателей соответствующих вспомогательных библиотек, которые вы используете. Хитрость заключается в следующем (выбрав в качестве примера shared_ptr): вы можете получить счетчики экземпляров для многих классов одновременно, исправив реализацию shared_ptr, а именно, добавив счетчики экземпляров в класс shared_ptr. Затем для некоторого класса Foo счетчик, принадлежащий shared_ptr‹Foo›, покажет вам количество экземпляров класса Foo.
Конечно, это не так точно, как добавление счетчиков непосредственно в соответствующие классы (экземпляры, на которые ссылаются только необработанные указатели, не учитываются), но, возможно, это достаточно точно для вашего случая. И, конечно же, речь не идет о постоянном изменении классов умных указателей — только во время поиска ошибок. По крайней мере, реализации интеллектуальных указателей не слишком сложны, поэтому исправить их несложно.
person
Dirk Herrmann
schedule
26.09.2020