【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 小时前
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
linux·开发语言·redis·python·bootstrap·lua
Wish3D3 小时前
阿里云OSS 上传文件 Python版本
开发语言·python·阿里云
凤年徐3 小时前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
oioihoii3 小时前
C++11 右值引用:从入门到精通
开发语言·c++
朝新_6 小时前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir6 小时前
Calendar类日期设置进位问题
java·开发语言
木子.李3477 小时前
排序算法总结(C++)
c++·算法·排序算法
风逸hhh7 小时前
python打卡day46@浙大疏锦行
开发语言·python
火兮明兮7 小时前
Python训练第四十三天
开发语言·python
freyazzr8 小时前
C++八股 | Day2 | atom/函数指针/指针函数/struct、Class/静态局部变量、局部变量、全局变量/强制类型转换
c++