处理容器类中动态分配的内存

Dealing With Dynamically Allocated Memory in Container Classes

本文关键字:内存 动态分配 容器类 处理      更新时间:2023-10-16

我很难理解容器是如何在C++中实现的。具体来说,我如何处理在堆栈上分配的数据与在堆中分配的数据。例如:

vector<int> VectorA;
VectorA.push_back (1);
VectorA.push_back (2);
VectorA.push_back (3);
vector<int*> VectorB;
VectorB.push_back (new int (1));
VectorB.push_back (new int (2));
VectorB.push_back (new int (3));

如何确保VectorB中的整数被正确删除。我记得在某个地方读到std::vector只调用析构函数,实际上并没有删除任何内容。此外,如果我想实现我自己的LinkedList类,我将如何处理这个特定的问题?

处理此问题的理想方法是使用智能指针作为容器的元素,而不是原始指针
否则,您必须手动自己进行内存管理

存储在向量中的对象无论如何都存储在堆上(在向量分配的空间中)。

单独分配对象(选项B)几乎没有什么好处,除非您打算以某种方式在向量之外管理它们。在这种情况下,向量可以销毁它存储的指针,并信任真正的所有者来销毁对象本身。

简单的答案是,大多数人根本不处理这样的事情。标准容器(例如std::vector)根本不存储原始对象——它们存储对象的副本。他们为自己的副本管理存储,而由您来管理原始副本的存储。

在存储指针的情况下,您基本上负责管理指针指向的存储。容器仍在制作(并管理其存储)副本,但它只是指针的副本,而不是它所引用的对象。这由你来处理。