[英]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.