【问题标题】:Finding memory usage of a single class in c++在 C++ 中查找单个类的内存使用情况
【发布时间】:2011-12-16 06:14:53
【问题描述】:

我有一个类classX,想知道这个类的所有实例使用了多少内存。每个新实例都是使用new classX创建的

有没有办法在不修改源代码的情况下做到这一点(即使用 valgrind 之类的工具)?

以及我可以使用哪些方法通过修改源代码来做到这一点(我不能修改每个实例的创建,但可以修改类本身)。
我能想到的唯一方法就是重载 new 运算符(但我不知道如何从那里调用原始的 new 运算符)!

【问题讨论】:

  • 如果classX 拥有(即包含指向)某个其他类的对象,您是否希望该对象占用的内存计入classX 实例的总数?跨度>
  • 不,我只是想要 (#instances)*(sizeof(classX))

标签: c++ memory memory-management new-operator


【解决方案1】:

在课堂上重载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 );
    }
};

【讨论】:

  • 哦,我以为这样的事情会进入无限循环。谢谢
  • @karan: 只要你记得函数中 new 之前的冒号就可以了
  • 记住 void* operator new[](size_t size) 和 void operator delete[]
  • @dmayola 除非真的需要,否则不需要超载。
【解决方案2】:

如果你想跟踪堆栈上的对象使用的空间,你最好在构造函数和析构函数中添加你的跟踪。像这样的东西应该可以完成这项工作。 唯一的潜在问题是您可能还需要跟踪动态分配的成员。

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;
}

【讨论】:

  • 请记住,这种方法仅适用于您的应用程序是单线程的或一次仅在单个线程中构造/销毁类的情况。 (否则,由于线程之间争用更新计数,计数可能会损坏。)
  • @bobbymcr 同意,线程让事情变得更丑陋,但并不多。在这种情况下,只需使用互斥锁保护每个计数,并提供尊重这些互斥锁的访问器函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2014-12-07
  • 2014-04-10
  • 2010-10-19
  • 2017-05-31
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多