2009-12-18 44 views
10

创建如何计算在C++怎么算在C++

请创建的对象的数量对象的数量用一个简单的例子来说明

+0

你只计算使用动态分配创建的对象还是具有自动存储的对象(如堆栈)? – 2009-12-18 18:05:24

回答

4

什么对象的数量?如果要计算特定类的对象数量,可以使用静态计数器。类似下面..上创造和毁灭的同时递减计数器加..

class A 
{ 
    public: 
    static int counter; 
    A() 
    { 
     counter ++; 
    } 
    virtual ~A() 
    { 
     counter --; 
    } 
}; 

int A :: counter = 0; 
+0

如果使用malloc创建对象,如何跟踪它? – 2013-04-14 18:04:56

+0

@KranthiKumar它*不是由'malloc()'创建的*'。'它被*分配*静态地,或'新',或在堆栈上;它是由其构造函数之一*构造的;它被析构函数销毁。 – EJP 2015-03-11 09:03:58

0

您可以创建一个计数器变量进入公众:你的类(这里假设你正在谈论你创建了一个类的对象计数)

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; 

ddj.com

+0

你应该阅读scott meyers的整篇文章,看看这个解决方案不是最好的。在文章结尾处,他描述了其他帖子中提到的模板方法。 – 2009-12-18 09:49:32

27

采取静态计数器创建模板类。

然后,应用程序中的每个对象都会扩展此模板类。

当构造函数被称为增量静态计数(静态变量是每个类 - 由该类的所有对象共享)。

例如看到使用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 
+0

嗨。好的方法。我从来不知道这一点。谢谢! – bdhar 2009-12-18 06:19:24

+0

前段时间我正在做一些静态多态性,碰到这个例子,我真的很喜欢它,静态多态也很酷... – stefanB 2009-12-18 06:21:40

+0

好的解决方案,虽然我有疑问..是否真的有必要使析构函数使用CRTP时虚拟在类模板中?我只是担心由v表导致的轻微尺寸开销。 – Naveen 2009-12-18 06:39:02

10
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

+3

@stefanB,这是正确的方法。你需要在Counter中有复制构造函数。 – Jagannath 2009-12-18 08:35:25

+1

+1,stefanB的方法不处理'X x2; X x3 = x2;'。但是你不能像这样初始化计数,因为它不是常量。 – KeatsPeeks 2009-12-30 18:52:27

+0

你是否正确...我想定义它outsied类。 – Ashish 2010-12-07 21:34:51

3

您必须重载新的和删除运算符 来计算内存分配。

void * operator new (size_t size) 
{ 
    void * p = malloc (size); 
    num_allocations++; 
    return p; 
} 

void operator delete (void * p) 
{ 
    num_deletions++; 
    free (p); 
} 
+0

如果你想跟踪堆上的对象,我认为new []和delete []也必须被重载。 – Ashish 2009-12-18 08:11:41

+0

是的,你是正确的Mac。我只是想让他开始。你需要重载你正在使用的新的每一个变体。 – DevDevDev 2009-12-19 00:25:34

+0

不会破坏代码?删除应该先调用析构函数; – NoSenseEtAl 2011-09-14 12:22:20