【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
相关推荐
Anastasiozzzz1 分钟前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步5 分钟前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机16 分钟前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经24 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
R_.L34 分钟前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan43 分钟前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
我在人间贩卖青春1 小时前
C++之this指针
c++·this
云姜.1 小时前
java多态
java·开发语言·c++
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳10301 小时前
C++:红黑树
开发语言·c++