Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中查找单个类的内存使用情况+;_C++_Memory_Memory Management_New Operator - Fatal编程技术网

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::coutIf
classX
拥有(即包含指向)某个其他类的对象,是否希望该对象占用的内存计入
classX
实例的总内存?不,我只想要(#实例)*(sizeof(classX))哦,我以为这样的事情会进入无限循环。thanx@karan:只要您在函数Memory void*operator new[](size\u t size)和void operator delete[]中记住new之前的冒号,就不会出现@dmayola除非确实需要,否则不需要重载这些线程。请记住,只有当应用程序是单线程的,或者一次只在一个线程中构造/销毁类时,这种方法才有效。(否则,由于线程之间的争用,计数可能会损坏。)@bobbymcr同意,线程使事情变得更加丑陋,但并不多。在这种情况下,只需使用互斥锁保护每个计数,并提供尊重这些互斥锁的访问器函数。