Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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_Class Instance Variables - Fatal编程技术网

C++ 如何统计每个类的实例数以及它们在本机C++;项目

C++ 如何统计每个类的实例数以及它们在本机C++;项目,c++,memory,class-instance-variables,C++,Memory,Class Instance Variables,我的编译器项目占用了大量内存。所以我想找到一个方法,可以找出哪个类是最差的。它应该给我一些类似于贝娄的东西: -------------------------------------------------------------------- Class name, Instance count, Peak memory consumed Circle, 223, 2230 k Rectangle, 124, 3220 k Line, 22322, 222322 k ....., .

我的编译器项目占用了大量内存。所以我想找到一个方法,可以找出哪个类是最差的。它应该给我一些类似于贝娄的东西:

--------------------------------------------------------------------
Class name, Instance count, Peak memory consumed

Circle, 223, 2230 k

Rectangle, 124, 3220 k

Line, 22322, 222322 k

....., ...,   .... .
我在网上搜索了很长时间,但至今没有结果(

我尝试过Devpartner工具,它不能处理我所知道的C++,因为我不知道如何使用它吗?
你有什么建议吗?

当然,我希望你说的是动态分配内存

您应该使用内存分析工具。

如果没有,您应该为自己的类重载
new和
delete`操作符,并在同一个类中实现内存计数机制。

您可以使用内存泄漏检测器或垃圾收集器。我个人使用Boehm GC作为垃圾收集器,但也可以将其用作泄漏检测器。我的朋友使用valgrind处理内存泄漏检测

也可以从自定义对象派生所有类,该自定义对象跟踪静态std::set结构中所有分配的对象;构造函数将“this”插入该结构,析构函数将其删除。然后可以使用静态对象::detectMemoryLeaks()在程序结束时,打印出所有泄漏对象及其typeid(ptr).name()

编辑:

在过去的几个小时里,我在我的库中实现了我的版本。还没有找到排除静态变量或自动确定多态对象大小的方法。另外,请原谅类似java的alienish代码和垃圾收集的存在:和。查找构造函数、析构函数、aliveObjects静态属性a第二个是listAliveObjects静态方法。你可以很容易地得到这个概念的要点

示例输出:

Frigo::Lang::Array<char> : 6 objects
Frigo::Lang::String : 6 objects
Frigo::Lang::Boolean : 2 objects
Frigo::Lang::Integer : 2 objects
Frigo::Math::Infinity : 1 objects
Frigo::Lang::Class : 1 objects

----

Frigo::Lang::Array<char> : 7 objects @ 0x1d33e18, 0x1d33e78, 0x1d33ed8, 0x1d33f38, 0x1d33f68, 0x1d33f98, 0x1d33fc8
Frigo::Lang::String : 7 objects @ 0x1d33e10, 0x1d33e70, 0x1d33ed0, 0x1d33f30, 0x1d33f60, 0x1d33f90, 0x1d33fc0
Frigo::Lang::Boolean : 2 objects @ 0x1d30fa8, 0x1d30fd8
Frigo::Lang::Integer : 2 objects @ 0x1d30e88, 0x1d30eb8
Frigo::Lang::Class : 1 objects @ 0x1d30f60
Frigo::Math::Infinity : 1 objects @ 0x41a110

----

Frigo::Lang::Array<char> : 6 objects
    Frigo::Lang::Array<char>@3b3e78
    Frigo::Lang::Array<char>@3b3ed8
    Frigo::Lang::Array<char>@3b3f38
    Frigo::Lang::Array<char>@3b3f68
    Frigo::Lang::Array<char>@3b3f98
    Frigo::Lang::Array<char>@3b3fc8
Frigo::Lang::String : 6 objects
    Frigo::Lang::Boolean
    Frigo::Lang::Class
    Frigo::Lang::Integer
    Hello World!
    true
    false
Frigo::Lang::Boolean : 2 objects
    true
    false
Frigo::Lang::Integer : 2 objects
    987
    123
Frigo::Math::Infinity : 1 objects
    Frigo::Math::Infinity@41a110
Frigo::Lang::Class : 1 objects
    Frigo::Lang::Class@3b0f60

----

Frigo::Lang::Array<char> : 7 objects
    @ 0x1cd3e18 : Frigo::Lang::Array<char>@1cd3e18
    @ 0x1cd3e78 : Frigo::Lang::Array<char>@1cd3e78
    @ 0x1cd3ed8 : Frigo::Lang::Array<char>@1cd3ed8
    @ 0x1cd3f38 : Frigo::Lang::Array<char>@1cd3f38
    @ 0x1cd3f68 : Frigo::Lang::Array<char>@1cd3f68
    @ 0x1cd3f98 : Frigo::Lang::Array<char>@1cd3f98
    @ 0x1cd3fc8 : Frigo::Lang::Array<char>@1cd3fc8
Frigo::Lang::String : 7 objects
    @ 0x1cd3e10 : Frigo::Lang::Boolean
    @ 0x1cd3e70 : Frigo::Lang::Class
    @ 0x1cd3ed0 : Frigo::Lang::Integer
    @ 0x1cd3f30 : Frigo::Math::Infinity
    @ 0x1cd3f60 : Hello World!
    @ 0x1cd3f90 : true
    @ 0x1cd3fc0 : false
Frigo::Lang::Boolean : 2 objects
    @ 0x1cd0fa8 : true
    @ 0x1cd0fd8 : false
Frigo::Lang::Integer : 2 objects
    @ 0x1cd0e88 : 987
    @ 0x1cd0eb8 : 123
Frigo::Lang::Class : 1 objects
    @ 0x1cd0f60 : Frigo::Lang::Class@1cd0f60
Frigo::Math::Infinity : 1 objects
    @ 0x41b110 : Frigo::Math::Infinity@41b110
Frigo::Lang::数组:6个对象
Frigo::Lang::String:6个对象
Frigo::Lang::Boolean:2个对象
Frigo::Lang::Integer:2个对象
Frigo::Math::无穷大:1个对象
Frigo::Lang::类:1个对象
----
Frigo::Lang::数组:0x1d33e18、0x1d33e78、0x1d33ed8、0x1d33f38、0x1d33f68、0x1d33f98、0x1d33fc8中的7个对象
Frigo::Lang::String:0x1d33e10、0x1d33e70、0x1d33ed0、0x1d33f30、0x1d33f60、0x1d33f90、0x1d33fc0中的7个对象
Frigo::Lang::Boolean:0x1d30fa8和0x1d30fd8中的2个对象
Frigo::Lang::Integer:0x1d30e88、0x1d30eb8上的2个对象
Frigo::Lang::Class:1对象@0x1d30f60
Frigo::Math::Infinity:1个对象@0x41a110
----
Frigo::Lang::Array:6个对象
弗里戈::朗::Array@3b3e78
弗里戈::朗::Array@3b3ed8
弗里戈::朗::Array@3b3f38
弗里戈::朗::Array@3b3f68
弗里戈::朗::Array@3b3f98
弗里戈::朗::Array@3b3fc8
Frigo::Lang::String:6个对象
Frigo::Lang::Boolean
Frigo::Lang::Class
Frigo::Lang::Integer
你好,世界!
真的
假的
Frigo::Lang::Boolean:2个对象
真的
假的
Frigo::Lang::Integer:2个对象
987
123
Frigo::Math::无穷大:1个对象
弗里戈:数学::Infinity@41a110
Frigo::Lang::类:1个对象
弗里戈::朗::Class@3b0f60
----
Frigo::Lang::Array:7个对象
@0x1cd3e18:Frigo::Lang::Array@1cd3e18
@0x1cd3e78:Frigo::Lang::Array@1cd3e78
@0x1cd3ed8:Frigo::Lang::Array@1cd3ed8
@0x1cd3f38:Frigo::Lang::Array@1cd3f38
@0x1cd3f68:Frigo::Lang::Array@1cd3f68
@0x1cd3f98:Frigo::Lang::Array@1cd3f98
@0x1cd3fc8:Frigo::Lang::Array@1cd3fc8
Frigo::Lang::String:7个对象
@0x1cd3e10:Frigo::Lang::Boolean
@0x1cd3e70:Frigo::Lang::Class
@0x1cd3ed0:Frigo::Lang::Integer
@0x1cd3f30:Frigo::Math::Infinity
@0x1cd3f60:你好,世界!
@0x1cd3f90:真
@0x1cd3fc0:错误
Frigo::Lang::Boolean:2个对象
@0x1cd0fa8:真
@0x1cd0fd8:错误
Frigo::Lang::Integer:2个对象
@0x1cd0e88:987
@0x1cd0eb8:123
Frigo::Lang::类:1个对象
@0x1cd0f60:Frigo::Lang::Class@1cd0f60
Frigo::Math::无穷大:1个对象
@0x41b110:Frigo::Math::Infinity@41b110

您可以尝试在类的构造函数中对类中声明的静态int进行原子递增(在win32中为InterlockedIncrement),并在类的析构函数中对其进行原子递减。然后,您可以使用另一个静态方法检索计数和消耗的总内存


假设您有少量可疑类,这应该不需要超过合理的编码工作量。

是的,大部分内存是动态分配的。但我没有为每个类重载new和delete运算符。他应该从自定义对象类派生,new和delete运算符可能有填充,这会使其不可能e决定编译器要在分配的内存中放置哪些对象。最近,我发现了一个工具——memoryvalidator。它解决了我的问题。这是我在windows上见过的功能最强大的内存分析工具。从他的问题来看,他似乎没有漏洞,而是想找出对象的大小。从但我的方法(重命名为listAliveObjects:)仍然有效,他只需手动计算实例计数中消耗的内存,或实现动态大小的函数……不知何故……要获得对象的实例计数,只需为每个类添加一个静态计数器,并在每次调用
constructor()
时递增它。