怎么算在C++
回答
什么对象的数量?如果要计算特定类的对象数量,可以使用静态计数器。类似下面..上创造和毁灭的同时递减计数器加..
class A
{
public:
static int counter;
A()
{
counter ++;
}
virtual ~A()
{
counter --;
}
};
int A :: counter = 0;
如果使用malloc创建对象,如何跟踪它? – 2013-04-14 18:04:56
@KranthiKumar它*不是由'malloc()'创建的*'。'它被*分配*静态地,或'新',或在堆栈上;它是由其构造函数之一*构造的;它被析构函数销毁。 – EJP 2015-03-11 09:03:58
您可以创建一个计数器变量进入公众:你的类(这里假设你正在谈论你创建了一个类的对象计数)
class Widget {
public:
Widget() { ++count; }
Widget(const Widget&) { ++count; }
~Widget() { --count; }
static size_t howMany()
{ return count; }
private:
static size_t count;
};
// obligatory definition of count. This
// goes in an implementation file
size_t Widget::count = 0;
你应该阅读scott meyers的整篇文章,看看这个解决方案不是最好的。在文章结尾处,他描述了其他帖子中提到的模板方法。 – 2009-12-18 09:49:32
采取静态计数器创建模板类。
然后,应用程序中的每个对象都会扩展此模板类。
当构造函数被称为增量静态计数(静态变量是每个类 - 由该类的所有对象共享)。
例如看到使用Curiously recurring template pattern对象计数器:
template <typename T>
struct counter
{
counter()
{
objects_created++;
objects_alive++;
}
virtual ~counter()
{
--objects_alive;
}
static int objects_created;
static int objects_alive;
};
template <typename T> int counter<T>::objects_created(0);
template <typename T> int counter<T>::objects_alive(0);
class X : counter<X>
{
// ...
};
class Y : counter<Y>
{
// ...
};
用法为了完整性:
int main()
{
X x1;
{
X x2;
X x3;
X x4;
X x5;
Y y1;
Y y2;
} // objects gone
Y y3;
cout << "created: "
<< " X:" << counter<X>::object_created
<< " Y:" << counter<Y>::object_created
<< endl;
cout << "alive: "
<< " X:" << counter<X>::object_alive
<< " Y:" << counter<Y>::object_alive
<< endl;
}
输出:
created: X:5 Y:3
alive: X:1 Y:1
template <class T>
class Counter
{
private:
static int count;
public:
Counter()
{
count++;
}
Counter(const Counter &c)
{
count++;
}
~Counter()
{
count--;
}
static int GetCount() {
return count;
}
}
template<class T>
int Counter<T>::count = 0;
class MyClass : private Counter<MyClass>
{
public:
using Counter<MyClass>::GetCount;
}
该技术被称为CRTP
@stefanB,这是正确的方法。你需要在Counter中有复制构造函数。 – Jagannath 2009-12-18 08:35:25
+1,stefanB的方法不处理'X x2; X x3 = x2;'。但是你不能像这样初始化计数,因为它不是常量。 – KeatsPeeks 2009-12-30 18:52:27
你是否正确...我想定义它outsied类。 – Ashish 2010-12-07 21:34:51
您必须重载新的和删除运算符 来计算内存分配。
void * operator new (size_t size)
{
void * p = malloc (size);
num_allocations++;
return p;
}
void operator delete (void * p)
{
num_deletions++;
free (p);
}
如果你想跟踪堆上的对象,我认为new []和delete []也必须被重载。 – Ashish 2009-12-18 08:11:41
是的,你是正确的Mac。我只是想让他开始。你需要重载你正在使用的新的每一个变体。 – DevDevDev 2009-12-19 00:25:34
不会破坏代码?删除应该先调用析构函数; – NoSenseEtAl 2011-09-14 12:22:20
- 1. 怎么算表
- 2. C#计算器exponet函数。怎么样?
- 3. 怎么算在线用户
- 4. 你怎么退出在C++
- 5. 我怎么可以在C
- 6. 我怎么能写在C#
- 7. 你怎么能在C
- 8. 我怎么能圆时间,在C#.NET计算时间,双时
- 9. MYSQL QUERY算了,怎么样?
- 10. PHP我怎么算细胞
- 11. 蟒蛇怎么算的HTML
- 12. 怎么算所选文件
- 13. 怎么算通过SqlDataSource的
- 14. Java。算术运算。怎么样?
- 15. C#怎么了font.DrawText
- 16. 我怎么用C#
- 17. 我该怎么办用C
- 18. 怎么办httpPost使用C#
- 19. 我怎么能包括C++
- 20. 文件在C,怎么办输入
- 21. 怎么可能居中形式在C#
- 22. 怎么写的天数在C#
- 23. ASP.net MVC3实体,不知道怎么算
- 24. 怎么算下载的文件
- 25. SQL怎么算免费预订
- 26. MYSQL的帮助,怎么算的结果
- 27. 怎么算连接表记录
- 28. Oxite:你打算怎么处理它?
- 29. 你会怎么称呼一个从未打算在C#中实例化的类?
- 30. 怎样计算在团体
你只计算使用动态分配创建的对象还是具有自动存储的对象(如堆栈)? – 2009-12-18 18:05:24