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;
}
相关文章:
- 具有 STL 向量类型成员的类的复制内存
- STL 向量无缘无故损坏,VC++ 2017
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- STL向量上出现奇怪的复制构造函数错误
- OpenMP 和不同的 STL 向量
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 使用 boost Spirit 解析为 STL 向量
- C++ 在列表末尾插入元素的列表的 STL 向量
- C++ 使用数组初始化时的 STL 向量内存管理
- 仅编写 c++ stl 向量的第一个元素的正确方法
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 限制指针访问STL ::向量元素
- 传递包裹在shared_ptr中的 STL 向量
- 如何将结构指针插入stl向量中并显示内容
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- erase() 不适用于结构/对象内的 STL 向量
- STL向量具有反向和pop/push_back成本
- 获取 STL 向量C++的地址
- Unique_ptr的 STL 向量 - 如何重置
- 带有 STL 向量的模板函数会因新的分配器而中断