2012-03-22 94 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一个实例,这恰好也存储在自己的内部信息堆(但是这是一个实现细节,你通常不需要担心它)。