【C++】vector扩容缩容

vector扩容缩容

1 扩容

一般来说,主要是重新分配内存

2 缩容

resize 缩小后,vector 的容量(capacity())可能保持不变,需要显式调用 shrink_to_fit() 来释放内存。

验证代码:

cpp 复制代码
#include <vector>
#include <iostream>

template <typename T>
class TrackingAllocator {
public:
    using value_type = T;

    TrackingAllocator() = default;

    // 允许从其他类型的 TrackingAllocator 构造
    template <typename U>
    TrackingAllocator(const TrackingAllocator<U>&) {}

    // 分配内存
    T* allocate(size_t n) {
        std::cout << "分配 " << n * sizeof(T) << " 字节" << std::endl;
        return static_cast<T*>(::operator new(n * sizeof(T)));
    }

    // 释放内存
    void deallocate(T* p, size_t n) {
        std::cout << "释放 " << n * sizeof(T) << " 字节" << std::endl;
        ::operator delete(p);
    }

    // 定义相等比较运算符
    bool operator==(const TrackingAllocator&) const noexcept {
        return true; // 无状态分配器,所有实例等价
    }

    // 定义不等比较运算符(可选,C++20 前需要)
    bool operator!=(const TrackingAllocator& other) const noexcept {
        return !(*this == other);
    }
};

int main() {
    // 使用自定义分配器的 vector
    std::vector<int, TrackingAllocator<int>> vec;

    // 测试 resize 缩小是否释放内存
    vec.resize(1000);  // 触发分配
    std::cout << "Size: " << vec.size() 
              << ", Capacity: " << vec.capacity() << std::endl;

    vec.resize(10);    // 缩小 size,但 capacity 不变
    std::cout << "Size: " << vec.size() 
              << ", Capacity: " << vec.capacity() << std::endl;

    vec.shrink_to_fit(); // 显式释放多余内存
    std::cout << "Size: " << vec.size() 
              << ", Capacity: " << vec.capacity() << std::endl;

    return 0;
}

测试不同标准库实现的行为:

编译器/库 resize 缩小是否自动释放内存
GCC (libstdc++) 否,需 shrink_to_fit
Clang (libc++) 否,需 shrink_to_fit
MSVC (MSVC STL) 否,需 shrink_to_fit

注意:gcc使用shrink_to_fit时,会重新分配空间

检测是否有内存泄漏:

shell 复制代码
valgrind --tool=memcheck --leak-check=full ./your_program
相关推荐
莎士比亚的文学花园2 分钟前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
图码9 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
U盘失踪了15 分钟前
python curl转python脚本
开发语言·chrome·python
charlie11451419116 分钟前
Linux 字符设备驱动:cdev、设备号与设备模型
linux·开发语言·驱动开发·c
handler0118 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
FQNmxDG4S18 分钟前
Java泛型编程:类型擦除与泛型方法的应用场景
java·开发语言·python
zhouwy11323 分钟前
Linux进程与线程编程详解
linux·c++
我星期八休息40 分钟前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
热心网友俣先生1 小时前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
01漫游者1 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript