重要的原因是stack是如何工作的。它只有推送和流行操作。在釋放之後的所有內容之前,您無法釋放堆棧中的內容。換句話說,如果函數返回時從棧中釋放了某些東西(例如函數調用的堆棧框架),則堆棧上方的所有內存也將被釋放(並且您最好確保它正確地被破壞,請參閱下面的內容)。
程序通常需要存儲獨立於堆棧的數據。有兩種方法:在編譯時分配內存,如static data,或在free store, also called heap中分配內存。
當然有可能有多個堆棧,事實上,這通常也可以在方便且有用的情況下完成。但它是通過使用堆棧容器變量完成的,其類型如std::stack
,然後將其用作僅用於數據的額外堆棧。通用處理器體系結構每個進程/線程只有一個「本地」堆棧,用於函數調用和堆棧變量,這些額外的堆棧總是由程序代碼分離和創建的,只是普通的數據結構與列表,地圖等相同。
關於你的問題的代碼,這一點要提出的是,在現代C++裸new
一般是令人難以接受的。您應該使用RAII mechansim如智能指針:
void fun()
{
auto a = std::unique_ptr<A>{ new A }; // C++11 syntax
// object is automatically destroyed when a goes out of scope, no leak
// note: heap should be used like this only if there's a reason, including:
// - A is big, and might conceivably overflow the stack
// - ownership of object may get moved and outlive the unique_ptr
}
和具體問題「存在於自由存儲創建的對象,不能由main()函數中使用的,爲什麼要的對象是在免費商店中創建。「,好吧,在問題代碼中,它不應該在免費商店中創建,沒有理由。它應該只是簡單的自動變量,當它超出範圍時會自動被破壞。
因爲免費商店有更多的自由空間 – billz
我認爲這是免費商店(堆)存在的唯一原因 - 理論上分配的內存與通過RAM可用。 –
@ManojAwasthi不止於此。儘可能多地爲當前內存模型尋址內存,具體取決於您擁有多少虛擬存儲。 4GB 32位地址空間可以在現代系統上輕鬆訪問。 (64bit,heh,不太容易=) – WhozCraig