【问题标题】:C++ STL Vector Memory Management When Initialized With Array?使用数组初始化时的 C++ STL 矢量内存管理?
【发布时间】:2019-11-24 17:23:05
【问题描述】:

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

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

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

【问题讨论】:

  • 不,它没有。 test_out 甚至不知道 out 是什么。
  • Remy 已经回答了您的问题。顺便说一句:我希望这是一个演示示例,您实际上并没有通过首先使用 new 创建一个数组然后将值复制到向量来填充向量。
  • @MikeMB 我确实指定它是一个示例函数:3
  • 是的,但我并不担心示例函数。我担心示例演示的模式。只是想确保您实际上没有使用中间动态数组来初始化向量。
  • @MikeMB 我正在使用 stb_image.h(一个相当流行的开源库的一部分)将图像加载为动态分配的数组。然后,用向量包装它。因此,我选择在示例函数中演示一个简单的动态数组分配。我觉得你的担心似乎超出了这个问题的范围。

标签: c++ arrays memory vector


【解决方案1】:

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

向量根本不包装数组。

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

没有。您正在使用以 2 个迭代器作为输入的构造函数来构造向量。它遍历源数组将其元素的值复制到向量的内部数组中。源数组本身是独立的,并且必须在mem_test() 退出之前明确地delete[]'d,否则它将被泄露。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多