2014-01-14 4 views
1

У меня есть класс данных, где я обычно передаю объекты этого класса с помощью shared_ptr. Теперь я хотел бы попытаться отслеживать, сколько shared_ptr существует для объектов этого класса. Обратите внимание, что это не то же самое, что и количество указателей на конкретный объект. Прежде всего, я хочу, чтобы это помогло идентифицировать возможные утечки памяти, но также есть ситуации, когда знание фактического числа полезно.Количество числа shared_ptr в существовании

Одна из моих идей заключалась в том, чтобы сохранить статический список слабых указателей для каждого построенного shared_ptr. Затем я мог периодически проверять, насколько многие из слабых указателей остаются в силе. Проблема в том, как я могу автоматически добавлять слабый указатель на список каждый раз, когда создается shared_ptr? Будет ли работать пользовательский распределитель?

Кто-нибудь знает разумный способ сделать это?

+0

Мне любопытно, какие полезные ситуации вы можете придумать для получения этой информации. ИМХО, эксплуатационные затраты на его реализацию намного превосходят любую выгоду. Утечки памяти следует отлаживать с помощью средств отладки вашей платформы, а общее количество объектов не очень полезно, потому что вы ничего не знаете о том, как они используются. Все ли они в одном контейнере? Если это так, просто используйте 'container.size()'. В противном случае, как вы знаете, сколько объектов используется каждой структурой контейнера/данных и т. Д.? Сколько объектов соответствует локальным переменным, временным и т. Д.? – bcrist

+0

Эксплуатационные расходы очень относительны и стараются быть менее субъективными, если вы не знаете приложение. Прямо сейчас самое важное для меня - подтвердить, что мои алгоритмы делают то, что я ожидаю от них. Иногда приятно знать, есть ли у меня примерно 1000 объектов в памяти по сравнению с 100 000. Кроме того, для обнаружения утечки памяти производительность, попадающая на подсчет объектов, меньше, чем использование чего-то вроде valgrind (что нетривиально для установки для android). – ryan0270

+0

Не предполагалось, чтобы judement был предназначен; Мне было любопытно. Мнения, высказанные мной, объясняются главным образом разработкой экосистем для настольных систем. Ваш вопрос о трудностях отладки мобильных приложений - это не то, о чем я думал, так что спасибо. – bcrist

ответ

3

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

template<class T, class... Args> 
    typename std::shared_ptr<T> make_recorded(Args... ar) 
    { 
    std::shared_ptr<T> ptr= make_shared<T>(ar) ; 
    // add your annotation/tracking here 
    return ptr ; 
    } 
+1

Скорее всего, вам нужно указать пользовательский деактивировать в 'make_recorded', чтобы обеспечить очистку аннотаций, если это необходимо. –

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