2012-07-28 99 views
1

通常,当我使用处于非本地范围的STL对象时,我存储指向要存储的数据的指针。例如,C++ STL内存管理:堆栈还是堆?

std::vector<MyStruct*> 

当清理向量的时候,我会通过并删除所有东西。我最近注意到,这并不像我想的那样是必要的。无论出于什么原因,我正在考虑STL类将数据存储在堆栈上,而现在我认为它将它分配到堆上。它是否正确?将对象存储为减少复制时间的指针是唯一真正的好处吗?

+3

'std :: vector '可以存储'Circle *'。 'std :: vector '可以不**存储'Circle'。 – DCoder 2012-07-28 09:55:53

+0

每个动态容器中的每个对象始终无条件地为* dynamic *对象,其生命周期由容器管理。内存分配策略的配置是什么,但这并不重要。请记住,C++将内存分配和对象创建分离为两个不同的概念和责任域。 – 2012-07-28 11:25:51

回答

6

标准容器通过Allocator对象分配内存,该对象的类型作为模板参数传递。如果你没有通过其他任何东西,那将是std::allocator<T>,它将使用new分配内存。底线:您可以强制他们几乎以任何方式分配内存,但默认情况下它会来自免费商店。

如果你真的想要一个指针容器,容器将拥有指针对象(例如,当对象被销毁时会自动删除它们),你可能想看看Boost Pointer Containers

2

当我要清理矢量的时候,我通过并删除 的一切。我最近注意到这不是必要的,就像我认为它是一样。

不要以为。如果在你的向量点指向动态分配的内存,那么你WILL需要删除记忆,矢量不会为你做。

例如,如果您的代码的类型是

MyStruct* pNewStruct = new MyStruct; 
myVector.push_back(pNewStruct); 

... 
... 

myVector.clear(); 

的你有内存泄漏你有没有具体你删除分配给要添加到向量中的每个元件的存储器。该向量释放它自己分配的内存作为动态数组的一部分,但这只是释放了指针数组,而不是它们指向的内存

3

使用指针来减少复制时间真正的好处。考虑一下可以改进的所有矢量操作 - 比如排序。

另一个真正的好处(如上面注释中所述)是,这允许您使用多态并将相关的对象存储在同一个向量中。一些你不能用标量对象(非指针)做的事情。

无论您存储在堆栈或堆数据不会向它是多么昂贵的移动对该对象的差异(嗯......确实如此,但往往是相当微不足道的,在这个讨论不相关)。

当您在STL向量中存储指向您的对象的指针时,向量不会取得对象的所有权。你仍然需要做尽职调查,并清除它们不再被需要的时候。

+0

谢谢,清除它:) – user1520427 2012-07-28 09:57:48

+0

+1多态性和dising可避免的批量复制:( – 2012-07-28 10:27:29

3

[...]而我现在认为它分配在堆上。它是否正确?

是的。如果声明的载体为:

std::vector<MyStruct*> v; 

那么你基本上存储在矢量指针,所以载体将分配内存来存储指针,而不是对象指向的指针。所以,当析构函数运行时,矢量会收回其已分配的内存,它不会解除分配指针一下决定的内存,即它不会解除分配内存存储在矢量指针指向。

但是,如果此声明:

std::vector<MyStruct> v; 

那么你存储对象本身,所以向量将分配的内存来存储的对象,它会释放它的析构函数运行时。