MST

星途 面试题库

面试题:C++ 中vector的内存管理机制

请描述C++中vector是如何进行内存管理的,包括内存的分配、增长策略以及释放机制。并举例说明在何种情况下会导致vector的内存重新分配。
24.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 内存分配

vector在内部使用动态数组来存储元素。当创建一个vector对象时,它会在堆上分配一块连续的内存空间来存储元素。例如:

std::vector<int> vec;

这里vec在初始时分配了足以容纳0个元素的内存(实际可能有少量额外开销)。

2. 增长策略

  • 初始容量vector的初始容量(capacity)可能为0,随着元素的插入,它会根据需要增加容量。
  • 容量增长方式:当vectorsize(当前存储的元素个数)达到capacity(当前分配的内存可容纳的最大元素个数)时,vector会重新分配内存。通常新的容量是原容量的两倍(不同编译器实现可能略有差异)。例如:
std::vector<int> vec;
for(int i = 0; i < 10; ++i) {
    vec.push_back(i);
}

这里随着元素不断插入,当容量不足时会重新分配内存并将旧元素复制到新内存。

3. 释放机制

  • 析构:当vector对象被销毁(例如超出作用域)时,它会自动释放其占用的内存。vector的析构函数会先调用每个元素的析构函数(如果元素是类类型),然后释放存储元素的动态数组的内存。
  • clearshrink_to_fitclear函数只是将size置为0,并不会释放内存,元素的析构函数会被调用。而shrink_to_fit尝试减少容量以匹配当前size,但这只是一个请求,不同编译器实现可能不同,不一定能完全达到释放多余内存的效果。例如:
std::vector<int> vec{1, 2, 3};
vec.clear(); // size变为0,但容量可能不变
vec.shrink_to_fit(); // 尝试减少容量到size大小

4. 导致内存重新分配的情况

  • push_back:当size达到capacity时,调用push_back添加新元素会导致内存重新分配。例如:
std::vector<int> vec;
for(int i = 0; i < 10; ++i) {
    std::cout << "size: " << vec.size() << ", capacity: " << vec.capacity() << std::endl;
    vec.push_back(i);
}

每次容量不足时,vector会重新分配内存,容量一般变为原来的两倍。

  • insert:在vector中间插入元素时,如果当前容量不足,也会导致内存重新分配。例如:
std::vector<int> vec{1, 2, 3};
vec.insert(vec.begin() + 1, 10); // 如果容量不足,会重新分配内存
  • resize:如果resize后的大小超过当前容量,会导致内存重新分配。例如:
std::vector<int> vec{1, 2, 3};
vec.resize(10); // 如果原容量小于10,会重新分配内存