[英]What happens when I clear a vector of struct?
memory 管理问题在这里。
我得到了一个结构Test1
的vector
,这个结构包含一个map
。 在我的程序中,函数将使用本地创建的地图在本地创建Test1
。
考虑以下代码:
#include <map>
#include <vector>
struct Vec3 {
float x, y, z;
};
struct Test1 {
int64_t a;
std::map<int, Vec3> mapy;
};
std::vector<Test1> global;
void ClearGlobal() {
global.clear();
}
void AddToGlobal() {
Vec3 test = { 1, 2, 3 };
std::map<int, Vec3> mapy;
mapy[1] = test;
global.push_back({ 10, mapy });
}
void main() {
AddToGlobal();
ClearGlobal();
}
我想知道当我清除那个向量时会发生什么? 所有结构都会从 memory 中释放出来吗?
我想知道当我清除那个向量时会发生什么?
根据文档,元素被删除。
所有结构都会从 memory 中释放出来吗?
向量的容量不变。
简短回答: Test1
的mapy
字段的 memory 将被释放,但结构本身的 memory 仍然存在。
长答案:
清除向量会调用向量内对象的析构函数,但不会释放对象。 这是来自cppreference的片段:
保持向量的容量()不变
这意味着sizeof(Test1)
大小的capacity()
元素不会被释放。 但是由于调用了析构函数,所以破坏了mapy
等内部字段。 由于mapy
在堆上拥有一些 memory,它的销毁释放了 memory。 结果,指向Test1
Test1
所有memory都被释放。
请注意,这种释放仅由于内部字段的析构函数而发生。 如果您的结构包含指向 memory 块的原始指针,并且如果Test1::~Test1
没有明确删除它,则在调用clear()
后不会释放 memory 块。 这可能会导致 memory 泄漏。
编辑:看到另一个答案,我想强调,在clear()
之后,没有任何元素是有效的,即使没有一个元素被释放。 除了通过重新创建向量中的元素的方法(例如push_back
、 emplace_back
、 resize
和insert
)之外,您不应该读取或写入它们。 在调用clear()
之后对元素的任何其他访问都是未定义的行为,这可能导致奇怪和不可预测的程序行为(主要是由于破坏了代码不依赖于未定义行为的假设而使编译器混淆)。 永远不要依赖未定义的行为。 永远不要故意调用未定义的行为,即使这在今天“似乎有效”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.