簡體   English   中英

與類堆疊VS堆

[英]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_myListstd::list一個實例,它恰好也將其內部信息存儲在堆上(但這是一個實現細節,您通常不必擔心它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM