关于指针+非指针的c ++内存问题

时间:2013-04-12 04:44:34

标签: c++ pointers memory

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

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消耗的内存吗?

编辑:免费 - &gt;删除

4 个答案:

答案 0 :(得分:3)

  1. 是的,矢量类可能会自动分配比需要更大的空间,以防您以后想要在其中存储更多数据,因此每次push_back()时它可能不会分配新的空间。
  2. 是的,但您应该使用delete interList;代替free()

答案 1 :(得分:1)

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

delete interList会破坏向量和向量所持有的整数。这里的向量将在堆上,整数也在堆上。实际上最好在堆栈上创建向量,或者作为vector<int> interList;之类的其他对象的成员。尽管在堆栈上的向量将int的元素作为数组存储在堆上。并且当int作为值类型存储时,一旦向量超出范围,则将回收整数的内存。

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

答案 2 :(得分:1)

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

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

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

delete interList;

答案 3 :(得分: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);

现在这也将释放所有内存,您永远不需要调用删除。更有甚者,你可以传递你的interList,它将引用为你计数。当最后一个参考丢失时,矢量将被释放。