std :: vector在哪里分配内存?

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将不受影响.

  • 我没有看到http://www.cplusplus.com/reference/std/memory/allocator/allocate/页面提到有关堆上默认分配的任何内容? (4认同)

Mat*_* M. 17

STL中的所有容器都使用模板参数进行参数化,通常调用最后一个参数AAllocator默认使用std::allocator<...>where ...表示容器中存储的值的类型.

Allocator是,用于提供存储器和建立/破坏在该存储器区域中的元素的类.它可以从池中或直接从堆中分配内存,无论您从哪个构建分配器.默认情况下,它std::allocator<T>是一个简单的包装器::operator new,因此在您推断时将在堆上分配内存.

内存按需分配,并且在vector调用析构函数时至少取消分配.C++ 11引入shrink_to_fit了更快发布内存.最后,当向量超出其当前容量时,将进行新的(更大的)分配,将对象移动到它,并释放旧的分配.

与所有局部变量一样,析构函数在执行时到达已声明的范围的末尾时被调用.因此,在退出函数之前,将调用向量析构函数,然后只有堆栈收缩并且控制权返回给调用者.