2010-12-22 80 views
6

我想在運行時確定一個對象的大小。 sizeof不起作用,因爲它在編譯時返回大小。這裏是我的意思的例子:如何在運行時確定一個C++對象的內存

class Foo 
{ 
public: 
    Foo() 
    { 
     c = new char[1024*1024*1024]; 
    } 
    ~Foo() 
    { 
     delete[] c; 
    } 

private: 
    char *c; 
}; 

在這種情況下,sizeof(Foo)將是4個字節,而不是〜1GB。我如何在運行時確定Foo的大小?提前致謝。

+1

可能的重複[如果免費()知道我的數組的長度,爲什麼我不能在我自己的代碼中要求?](http://stackoverflow.com/questions/2650895/if-free-knows我的數組爲什麼不能在我自己的代碼中請求它) – 2010-12-22 21:35:35

+2

您可能想要區分對象的大小和由目的。您設置`c`指向的分配將永遠不會成爲對象本身的一部分。類「Foo」的對象將全部具有相同的大小(這將是上述示例中數據指針的大小)。這是一個有點迂腐,但... – dmckee 2010-12-22 21:37:50

回答

5

你需要以某種方式自己跟蹤它。例如:

struct Foo 
{ 
    Foo() 
     : elements(1024 * 1024 * 1024) 
    { 
     c.reset(new char[elements]); 
    } 

    boost::scoped_array<char> c; 
    int elements; 
}; 

注意,你應該使用一個智能指針容器來管理動態分配的對象,這樣你就不必手動管理他們的壽命。在這裏,我演示了使用scoped_array,這是一個非常有用的容器。您還可以使用shared_array或使用shared_ptr和自定義刪除程序。

5

Foo的大小是恆定的。約1GB的字符在技術上並不屬於該對象,只是指向它的指針。字符只被認爲是由對象擁有,因爲對象負責爲它們分配和釋放內存。 C++不提供允許您查找對象已分配多少內存的功能。你必須自己跟蹤。

1

對象的大小系統上的4個字節。但是,該對象使用其他資源,例如1GB的內存。

相關問題