繁体   English   中英

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

[英]C++ STL Vector Memory Management When Initialized With Array?

如果我使用动态分配的数组初始化向量,则稍后向量会超出范围并要释放,向量会从要包装的数组中释放内存吗? 更具体地说,假设我有一个示例函数:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM