0

假设我已经声明了一个变量

vector<int>* interList = new vector<int>();
interList->push_back(1);
interList->push_back(2);
interList->push_back(3);
interList->push_back(4);

第一个问题是当我 push_back 一个 int 时,会消耗一个内存空间吗?

第二个问题如果我(删除interList),1,2,3,4消耗的内存会自动释放吗?

编辑:免费->删除

4

4 回答 4

3
  1. 是的,如果您以后想在其中存储更多数据,vector 类可能会自动分配比需要更大的空间,因此它可能不会在每次push_back().
  2. 是的,但您应该使用delete interList;而不是free().
于 2013-04-12T04:47:01.720 回答
1

push_back将元素复制到堆中,向量将在其中分配数组来存储元素。的容量vector可以大于所需的或大于向量具有的元素数。每次推回发生时,向量都会检查是否有足够的空间,如果没有,则将所有元素移动到更大的空间,然后将元素推入数组。向量总是将元素放置到连续的内存块中,因此如果内存块不足以将所有元素保存在一起,那么它将所有元素移动到更大的块并附加新元素。为了避免这种频繁移动,向量通常会分配更大的内存块。

delete interList会破坏向量和向量持有的整数。这里向量将在堆上,整数也将在堆上。实际上,最好在堆栈上创建向量或作为其他对象的成员,例如vector<int> interList;The vector 虽然在堆栈上将 int 的元素存储在堆上作为数组。并且由于整数被存储为值类型,所以一旦向量超出范围,整数的内存就会被回收。

因为向量具有值类型。它们被向量复制到堆中,并作为数组存储和管理,它们的生命周期与向量的生命周期相关联。如果你有一个指针向量,那么你必须担心。Likevector<T*> list; list.push_back(new T());列表存储指向类型对象的指针T。当您销毁此类矢量时,T不会删除对象。这就像一个带有指向 a 的指针的类T*。您必须遍历所有元素并在指针上调用 delete 或使用共享指针向量。建议使用共享指针或唯一指针向量。

于 2013-04-12T04:47:58.373 回答
1

std::vector 一次为一定数量的元素分配连续的内存块。因此,每次插入新元素时,它都会插入到保留块中,并且内存空间保持不变,不会发生新的分配。

如果您在分配的块(向量的容量)之外插入元素,那么它会分配一个更大的块(调整大小),将所有先前的元素复制到其中并销毁旧块。所以vector自己管理内存,并不是每个插入的元素都会导致内部缓冲区的重新分配。

第二个问题 - 是的,如果你删除 vector 本身,vector 将清理所有内存。

delete interList;
于 2013-04-12T04:48:38.177 回答
1

如果可以提供帮助,最好不要直接分配向量。所以你的代码看起来像这样:

vector<int> interList;
interList.push_back(1);
interList.push_back(2);
interList.push_back(3);
interList.push_back(4);

现在,当 interList 超出范围时,所有内存都会被释放。事实上,这是 C++ 的所有资源管理的基础,有点通俗地称为 RAII(资源获取是初始化)。

现在,如果您觉得绝对必须分配向量,则应该使用资源管理智能指针之一。在这种情况下,我使用 shared_ptr

auto interList =  std::make_shared<vector<int>>();
interList->push_back(1);
interList->push_back(2);
interList->push_back(3);
interList->push_back(4);

现在这也将释放所有内存,您永远不需要调用 delete。更重要的是,您可以将 interList 传递给您,它会为您引用计数。当最后一个引用丢失时,向量将被释放。

于 2013-04-12T07:18:21.307 回答