Нахождение использования памяти одного класса в C ++ - PullRequest
4 голосов
/ 16 декабря 2011

У меня есть класс classX, и я хотел бы знать, сколько памяти используют все экземпляры этого класса. Каждый новый экземпляр создается с использованием new classX

Есть ли способ сделать это без изменения исходного кода (например, с помощью таких инструментов, как valgrind)?

И какие методы я могу использовать для этого, изменив исходный код (я не могу изменить создание каждого экземпляра, но могу изменить сам класс).
Единственный способ, о котором я могу подумать, - это перегрузить новый оператор (но я не знаю, как оттуда вызвать оригинальный новый оператор)!

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Довольно просто перегрузить operator new() в классе.Глобальный может быть вызван с помощью :: для указания глобального пространства имен, как в ::operator new().Как то так:

class ClassX {
public:
    void* operator new( size_t size )
    {
        // whatever logging you want
        return ::operator new( size );
    }
    void operator delete( void* ptr )
    {
        // whatever logging you want
        ::operator delete( ptr );
    }
};
3 голосов
/ 16 декабря 2011

Если вы хотите отслеживать пространство, используемое объектами в стеке, вам лучше добавить отслеживание в конструктор и деструктор. Нечто подобное должно делать работу. Единственная потенциальная проблема заключается в том, что могут быть динамически распределенные элементы, которые вам тоже нужно отслеживать.

class Tracked
{
   static int space_used;
   static int space_released;
   Tracked() { space_used += sizeof(Tracked); }
   ~Tracked() { space_released += sizeof(Tracked); }
};

int Tracked::space_used = 0;
int Tracked::space_released = 0;

int main()
{
   {
     Tracked t;
     Tracked * t_ptr = new Tracked();
   }

   std::cout<<"used      :"<< Tracked::space_used <<std::endl;
   std::cout<<"released  :"<< Tracked::space_released <<std::endl;
   std::cout<<"live      :"<< Tracked::space_used - Tracked::space_released <<std::endl;
}
...