2012-03-22 126 views
1

假設你有一個簡單的類有一些存儲數據結構(列表,向量,隊列等)堆棧VS堆帶類

class MyClass 
{ 
public: 
    std::list<OtherClass*> m_myList; 
}; 

現在假設我們在堆上分配這個類。

MyClass* pClass = new MyClass(); 

現在,當我們向這個列表中添加更多的項目時,它們是堆棧還是堆棧? 示例:

OtherClass* pOtherClass = new OtherClass(); 
pClass->m_myList.push_front(pOtherClass); 

感謝您的幫助!

+0

這是C++,不是Java或C#。你很可能使用'new'太多。 – 2012-03-22 08:02:19

回答

2

標準集合類使用Allocator類爲正在存儲的項目分配內存。默認分配器將在免費商店中分配數據。如果你願意,你可以提供你自己的,我想如果你想足夠厲害,你可以讓它在堆棧上分配空間,但是你必須做大量的額外工作才能實現。

請注意,您在而不是必須在免費商店分配對象本身,以使其發生。事實上,你的MyClass *pClass = new MyClass();通常是一個不好的主意。您通常只想使用MyClass Class;並完成它。這將爲堆棧中的集合對象本身(通常很小)分配空間,但它存儲的空間通常仍然來自免費存儲區(再次通過分配器)。除此之外,這有助於自動化內存管理 - 當集合對象超出範圍時,它將被銷燬。它的析構函數將銷燬它所包含的對象並釋放內存(全部自動)。

+0

謝謝傑裏。這個類只是爲了讓這個例子變得微不足道,我真正的類有很多其他的成員數據,所以有必要使用新的權利? – 2012-03-22 00:54:54

+1

@ user1229962:也許吧。另一方面,如果它有足夠的直接成員將其存儲在堆棧上引起問題,則無論如何它可能已經有設計問題。 – 2012-03-22 00:56:38

2

std::list存儲到堆上的元素,所以它無所謂你的班級在哪裏。

+0

我是通過在將元素插入列表之前自行分配元素來降低效率或導致內存泄漏? – 2012-03-22 00:52:07

+0

可以既是或者既不是。你也需要一個很好的理由去思考效率......如果不知道更多的東西,就不能回答這個問題。瞭解新/自由/共享指針,爲什麼以及何時需要它們......現在是一個簡單的規則:只在需要時纔在堆上進行分配。 – 2012-03-22 00:56:54

1

無論如何,標準模板類的默認分配器都分配在堆上。 所以,他們會在堆上。

1

簡單的規則:如果你正在分配新的OtherClass對象new,那麼他們在堆上。 new只有從堆中分配內存。 (例外:如果您使用的是自定義的分配器,這是一種先進的C++功能,他們可以在你選擇的任何存儲區。)

m_myListstd::list一個實例,這恰好也存儲在自己的內部信息堆(但是這是一個實現細節,你通常不需要擔心它)。