C++ 在c+中查找单个类的内存使用情况+;
我有一个类C++ 在c+中查找单个类的内存使用情况+;,c++,memory,memory-management,new-operator,C++,Memory,Memory Management,New Operator,我有一个类classX,想知道这个类的所有实例使用了多少内存。每个新实例都是使用newclassx 有没有一种方法可以在不修改源代码的情况下做到这一点(即使用valgrind之类的工具) 通过修改源代码,我可以使用什么方法来实现这一点(我不能修改每个实例的创建,但可以修改类本身) 我能想到的唯一方法就是重载新操作符(但我不知道如何从那里调用原来的新操作符) 在类中很容易重载操作符new()。然后可以使用:调用全局名称空间,如::operator new()中所示。大概是这样的: class Cl
classX
,想知道这个类的所有实例使用了多少内存。每个新实例都是使用newclassx
有没有一种方法可以在不修改源代码的情况下做到这一点(即使用valgrind之类的工具)
通过修改源代码,我可以使用什么方法来实现这一点(我不能修改每个实例的创建,但可以修改类本身)我能想到的唯一方法就是重载新操作符(但我不知道如何从那里调用原来的新操作符) 在类中很容易重载
操作符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 );
}
};
如果要跟踪堆栈上对象使用的空间,最好在构造函数和析构函数中添加跟踪。像这样的东西应该能完成任务。 唯一的潜在问题是,可能还需要跟踪动态分配的成员
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;
}
类跟踪
{
使用静态int空间;
静态int空间_释放;
Tracked(){space_used+=sizeof(Tracked);}
~Tracked(){space_released+=sizeof(Tracked);}
};
int Tracked::space_used=0;
int Tracked::space_released=0;
int main()
{
{
跟踪t;
跟踪*t_ptr=新跟踪();
}
std::coutIfclassX
拥有(即包含指向)某个其他类的对象,是否希望该对象占用的内存计入classX
实例的总内存?不,我只想要(#实例)*(sizeof(classX))哦,我以为这样的事情会进入无限循环。thanx@karan:只要您在函数Memory void*operator new[](size\u t size)和void operator delete[]中记住new之前的冒号,就不会出现@dmayola除非确实需要,否则不需要重载这些线程。请记住,只有当应用程序是单线程的,或者一次只在一个线程中构造/销毁类时,这种方法才有效。(否则,由于线程之间的争用,计数可能会损坏。)@bobbymcr同意,线程使事情变得更加丑陋,但并不多。在这种情况下,只需使用互斥锁保护每个计数,并提供尊重这些互斥锁的访问器函数。