2013-08-01 70 views
1

我正在編寫一個大代碼,並且我準備了一個內存類,以便安全地創建和增長不同類型的數組。在這個類中,我記錄了分配新指針時使用sizeof分配的內存大小。但是,我不知道如何跟蹤內存分配。 讓我以另一種方式提出我的問題。例如,假設我們在代碼中的某些點分配一個新的數組:如何查找釋放的內存大小

double* array=new double[size]; 

和別的地方,我們要解除分配的內存不知道大小,通常我們會自動使用

delete [] array; 

delete運算符釋放數組的內存,是否有任何方法可以確定它有多少個字節可用(假設我們不跟蹤大小)?

+0

std :: vector會爲您節省那些麻煩(capacity * sizeof(T)) – Borgleader

+0

特別是因爲數組是邪惡的;) – PoByBolek

+1

如果您使用'new []'分配內存,實際上會在實際數組本身指示數組大小。 'delete []'讀取這些數據,以便知道需要多少次迭代。你可以閱讀,如果你想要一個hackish非便攜式答案哈哈。或者,用代碼重載分配器以跟蹤你想要的內容。 – Suedocode

回答

2

一般來說,答案是否定的,因爲內存管理器隱藏那種從您實現相關的信息。此外,C++不提供任何標準方式來跟蹤實際使用/釋放的內存量。可能存在特定於某個平臺/操作系統的功能,但沒有100%可移植的功能。

+0

技術術語是「未指定的」,這意味着實現可以選擇做任何想做的事情,而不必記錄它。 – DanielKO

0

改爲使用std::vector,而當您刪除它時,可以事先調用此函數以查明清除了多少:vec.capacity() * sizeof(OBJECT)將爲您提供存儲在向量中的字節數。

0

爲了跟蹤分配的內存,你需要實現manuelly某種計數機制,例如用一個靜態(專用)成員來計算分配的字節數。

0

如果你想有完全控制超過內存分配和釋放你應該使用
memory pool

土生土長內存池快速安全和相對容易實現 - 除非你想花哨的東西。實現這樣的機制將爲您提供諸如內存泄漏等各種信息。計算釋放的內存也很輕鬆,因爲鏈表包含分配的全部內存。

點擊big friendly button跳水時

0

我意識到另一個答案已經被接受,但這裏是你如何寫自己的分配器,如果你想非常簡單賽道存儲器陣列:

#include <map> 
#include <iostream> 

using namespace std; 

map<void*,size_t> memmap; //put this as a global variable in an implementation file, and extern it in the header file. 

class MyManagedClass{ 
public: 
    MyManagedClass(){} 
    void* operator new[](size_t sz){ 
     void* out = operator new(sz*sizeof(MyManagedClass)); 
     for(size_t i=0; i<sz; ++i) 
      *((MyManagedClass*)out+sz)=MyManagedClass::MyManagedClass(); 
     memmap[out] = sz; 
     return out; 
    } 

    void operator delete[](void* t){ 
     cout << "Freed units: " << memmap[t] << endl; 
     memmap.erase(t); 
     delete[] t; 
    } 
}; 

int main(){ 
    MyManagedClass* ip = new MyManagedClass[10]; 
    delete[] ip; 
    system("pause"); 
} 

我應該提到,這是一個令人毛骨悚然的方式來做到這一點,你可以使它更好/通用的模板和更深思熟慮的內存設計大聲笑。