2014-03-25 154 views
4

如果使用非指針成員變量和非指針成員函數在C++中創建類,但您是否動態初始化類的實例(使用指針)是否會影響內存使用堆或堆棧?堆棧vs堆棧內存使用情況C++用於動態創建的類

一個項目的有用信息我正在努力減少內存堆棧:)。

任何反應非常感謝。

非常感謝和快樂的編碼。

回答

8

如果您使用運營商new分配您的課程,那麼將其放在堆上。無論是否通過指針訪問成員變量。

class A { 
    int a; 
    float* p; 
}; 
A* pa = new A(); // required memory is put on the heap 
A a; // required memory is put on the stack 

但要小心,因爲並非每個指針訪問的實例都可能實際位於堆中。例如:

A a; // all members are on the stack 
A* pa = &a; // accessed by pointer, but the contents are still not on the heap! 

在另一側位於堆棧上的類實例可以具有其大部分在堆中的數據:

class B { 
public: 
    std::vector<int> data; // vector uses heap storage! 
    B() : data(100000) {} 
}; 
B b; // b is on the stack, but most of the memory used by it is on the heap 
+2

此外,具有靜態存儲持續時間的對象(例如全局對象或靜態本地對象)分配在堆上 –

+0

感謝大家的徹底和迅速的迴應! @king_nak,這是否意味着在函數中調用的對象(不在main中)也位於堆上,而不管是否使用了new? –

1

如果使用'new'創建對象,則在堆中創建對象。

0

用於指針變量存儲器將在stack但是當被分配您正在使用newmalloc那麼該內存段將分配在heap