[英]Stack VS Heap with Classes
假設您有一個帶有某些存儲數據結構(列表,向量,隊列等)的簡單類
class MyClass
{
public:
std::list<OtherClass*> m_myList;
};
現在讓我們在堆上分配此類。
MyClass* pClass = new MyClass();
現在,當我們將更多項目添加到此列表中時,它們是在堆上還是在堆棧上? 例:
OtherClass* pOtherClass = new OtherClass();
pClass->m_myList.push_front(pOtherClass);
謝謝您的幫助!
std::list
存儲到堆上的元素,因此您的類不在哪里都無所謂。
標准集合類使用Allocator
類為要存儲的項目分配內存。 默認分配器將在免費存儲區上分配數據。 如果願意,您可以提供自己的工具,我想如果您想做的不夠好,可以讓它在堆棧上分配空間,但是您必須做大量的額外工作才能實現這一目標。
請注意,您也不必在免費存儲區上分配對象本身即可實現此目的。 實際上,您的MyClass *pClass = new MyClass();
通常不是一個好主意。 您通常只想使用MyClass Class;
並完成它。 這將為堆棧上的收集對象本身分配空間(通常很小),但是用於存儲對象的空間通常仍將來自空閑存儲(同樣,通過分配器)。 除其他事項外,這有助於自動化內存管理-當收集對象超出范圍時,它將被銷毀。 它的析構函數將銷毀它包含的對象並釋放內存(全部自動)。
無論如何,標准模板類的默認分配器都會在堆上分配。 因此,它們將處於堆中。
最簡單的原則:如果你分配新OtherClass
與對象new
,那么他們是在堆上。 new
僅從堆分配內存。 (例外:如果您使用自定義分配器(這是C ++的高級功能),則它們可以位於您選擇的任何內存區域中。)
您的m_myList
是std::list
一個實例,它恰好也將其內部信息存儲在堆上(但這是一個實現細節,您通常不必擔心它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.