堆栈VS堆与类

时间:2012-03-22 00:47:19

标签: c++ stack heap

假设你有一个带有一些存储数据结构的简单类(列表,向量,队列等)

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

现在假设我们在堆上分配这个类。

MyClass* pClass = new MyClass();

现在,当我们向此列表添加更多项目时,它们是在堆上还是堆栈上? 例如:

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

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

std::list存储到堆上的元素,因此您的类在哪里都无关紧要。

答案 1 :(得分:2)

标准集合类使用Allocator类为存储的项目分配内存。默认分配器将在免费存储上分配数据。如果你愿意,你可以提供你自己的,我想如果你想要足够糟糕,你可以让它在堆栈上分配空间,但你必须做相当多的额外工作才能实现这一点。

请注意,必须在免费商店中分配对象本身才能实现。事实上,您的MyClass *pClass = new MyClass();通常是一个糟糕的主意。您通常只想使用MyClass Class;并完成它。这将在堆栈上为集合对象本身(通常非常小)分配空间,但它存储的空间通常仍然来自免费存储(再次通过分配器)。除此之外,这有助于自动化内存管理 - 当集合对象超出范围时,它将被销毁。它的析构函数将破坏它包含的对象并释放内存(全部自动)。

答案 2 :(得分:1)

标准模板类的默认分配器在堆上分配,无论如何。 所以,他们会在堆上。

答案 3 :(得分:1)

简单规则:如果您使用OtherClass分配新的new个对象,那么它们就在堆上。 new 从堆中分配内存。 (例外:如果您使用自定义分配器,这是一种高级C ++功能,它们可以位于您选择的任何内存区域。)

您的m_myListstd::list的一个实例,它恰好也将其内部信息存储在堆上(但这是一个实现细节,您通常不需要担心它)。