YoF*_*kie 26 c++ memory-management stl vector
请考虑以下代码段:
#include <vector>
using namespace std;
void sub(vector<int>& vec) {
vec.push_back(5);
}
int main() {
vector<int> vec(4,0);
sub(vec);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
假设"vec"没有空间将5存储在"sub"函数中,它在哪里分配新的内存?
在子函数的堆栈框架中?在这种情况下,5将在子函数的末尾被删除.但是主函数的堆栈帧不能增长,因为子函数的堆栈帧在那一刻位于堆栈的顶部.
std :: vector是否为堆上的元素分配内存?但它如何释放堆内存呢?如果它是堆栈上的本地向量,那么包含该向量的函数的堆栈帧最终会被删除,而不会发信号通知它将被删除吗?
Dou*_* T. 35
std :: vector是否为堆上的元素分配内存?
是.或者更准确地说,它根据您在构造时传入的分配器进行分配.您没有指定一个,因此您获得默认分配器.默认情况下,这将是堆.
但它如何释放堆内存呢?
当它超出范围时通过它的析构函数.(注意,指向超出范围的向量的指针不会触发析构函数).但是,如果你已经通过值传递给sub你构建(并在以后破坏)一个新副本.然后,5将被推回到该副本上,副本将被清除,并且向量main将不受影响.
Mat*_* M. 17
STL中的所有容器都使用模板参数进行参数化,通常调用最后一个参数A或Allocator默认使用std::allocator<...>where ...表示容器中存储的值的类型.
的Allocator是,用于提供存储器和建立/破坏在该存储器区域中的元素的类.它可以从池中或直接从堆中分配内存,无论您从哪个构建分配器.默认情况下,它std::allocator<T>是一个简单的包装器::operator new,因此在您推断时将在堆上分配内存.
内存按需分配,并且在vector调用析构函数时至少取消分配.C++ 11引入shrink_to_fit了更快发布内存.最后,当向量超出其当前容量时,将进行新的(更大的)分配,将对象移动到它,并释放旧的分配.
与所有局部变量一样,析构函数在执行时到达已声明的范围的末尾时被调用.因此,在退出函数之前,将调用向量析构函数,然后只有堆栈收缩并且控制权返回给调用者.