繁体   English   中英

C ++ STL内存管理:堆栈还是堆?

[英]C++ STL Memory Management: Stack or Heap?

通常,当我使用非本地范围内的STL对象时,我会存储指向要存储的数据的指针。 例如

std::vector<MyStruct*> 

是时候清理向量了,然后检查并删除所有内容。 我最近注意到,这不是我认为那样的必要。 无论出于什么原因,我都在考虑STL类将数据存储在堆栈上,而现在我认为它是在堆上分配数据。 这个对吗? 将对象存储为指针以减少复制时间的唯一真正好处是?

标准容器通过Allocator对象分配内存,该对象的类型作为模板参数传递。 如果您没有传递其他任何内容,则将使用std::allocator<T> ,它将使用new来分配内存。

底线:您可以强迫他们几乎以任何您想要的方式来分配内存,但是默认情况下它将来自免费存储。

如果您真的想要一个指针容器,那么该容器将拥有pointee对象(例如,在销毁对象时将自动删除它们),则可能需要查看Boost Pointer Containers

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

另一个真正的好处(如上面的评论中所述)是,这允许您使用多态并将相关对象存储在同一向量中。 标量对象(非指针)无法执行的操作。

无论是将数据存储在堆栈还是堆上,都不会改变移动该对象的代价(好吧……确实如此,但在本次讨论中通常可以忽略不计且无关紧要)。

当您将指向对象的指针存储在STL向量中时,向量不会获得对象的所有权 您仍然需要进行尽职调查,并在不再需要它们时进行清理。

[...]而我现在认为它是在堆上分配它的。 这个对吗?

是。 如果将向量声明为:

std::vector<MyStruct*> v;

那么您基本上是将指针存储在向量中,因此向量将分配存储空间来存储指针 ,而不是指针所指向的对象。 因此,当析构函数运行时,向量将释放其已分配的内存,而不将其本身分配的指针的内存释放,即,将不会释放向量中存储的指针指向的内存。

但是,如果您声明:

std::vector<MyStruct> v;

那么您将自己存储对象,因此矢量将分配内存来存储对象,并且在析构函数运行时将对其进行分配。

是时候清理向量了,然后检查并删除所有内容。 我最近注意到,这不是我认为那样的必要。

不要以为那样。 如果向量中的指针指向动态分配的内存,则您需要删除该内存,因为向量不会为您完成此操作。

例如,如果您的代码属于

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

 ...
 ...

 myVector.clear();

您存在内存泄漏,因为您没有明确删除分配给添加到向量中每个元素的内存。 向量释放它作为动态数组的一部分在其内部分配的内存,但这只会释放指针数组,而不是它们指向的内存

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM