C++ 使用数组初始化时的 STL 向量内存管理

C++ STL Vector Memory Management When Initialized With Array?

本文关键字:STL 向量 内存 管理 数组 初始化 C++      更新时间:2023-10-16

如果我用动态分配的数组初始化一个向量,那么稍后向量就会超出范围并被释放,那么向量是否会从它正在包装的数组中释放内存?更具体地说,假设我有一个示例函数:

std::vector<float> mem_test() {
    unsigned char* out = new unsigned char[10];
    for (int i = 0; i < 10; i++) {
        out[i] = i * i;
    }
    std::vector<float> test_out(out, out + 10);
    return test_out;
}
int main() {
    std::vector<float> whatever = mem_test();
    // Do stuff with vector
    // Free vector
    std::vector<float>().swap(whatever);
}

当从函数返回的向量超出范围或被手动释放时,底层动态分配的数组是否也会释放其内存?

向量是否从它正在包装的数组中释放内存?

向量根本不包装数组。

当从函数返回的向量超出范围或被手动释放时,底层动态分配的数组是否也会释放其内存?

不。您正在使用将 2 个迭代器作为输入的构造函数构造向量。它遍历源数组,将其元素的值复制到向量的内部数组中。源数组本身是独立的,必须在mem_test()退出之前显式delete[],否则将被泄漏。

std::vector<float> mem_test() {
    unsigned char* out = new unsigned char[10];
    for (int i = 0; i < 10; i++) {
        out[i] = i * i;
    }
    std::vector<float> test_out(out, out + 10);
    delete[] out; // <-- HERE
    return test_out;
}

或者:

std::vector<float> mem_test() {
    std::unique_ptr<unsigned char[]> out(new unsigned char[10]); // <-- auto delete[]'d
    for (int i = 0; i < 10; i++) {
        out[i] = i * i;
    }
    std::vector<float> test_out(out.get(), out.get() + 10);
    return test_out;
}