假设我已经声明了一个变量
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;删除
答案 0 :(得分:3)
push_back()
时它可能不会分配新的空间。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,它将引用为你计数。当最后一个参考丢失时,矢量将被释放。