2009-12-18 45 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