繁体   English   中英

当我清除一个结构向量时会发生什么?

[英]What happens when I clear a vector of struct?

memory 管理问题在这里。

我得到了一个结构Test1vector ,这个结构包含一个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 中释放出来吗?

向量的容量不变。

简短回答Test1mapy字段的 memory 将被释放,但结构本身的 memory 仍然存在。

长答案

清除向量会调用向量内对象的析构函数,但不会释放对象。 这是来自cppreference的片段:

保持向量的容量()不变

这意味着sizeof(Test1)大小的capacity()元素不会被释放。 但是由于调用了析构函数,所以破坏了mapy等内部字段。 由于mapy在堆上拥有一些 memory,它的销毁释放了 memory。 结果,指向Test1 Test1所有memory都被释放。

请注意,这种释放仅由于内部字段的析构函数而发生。 如果您的结构包含指向 memory 块的原始指针,并且如果Test1::~Test1没有明确删除它,则在调用clear()后不会释放 memory 块。 这可能会导致 memory 泄漏。

编辑:看到另一个答案,我想强调,在clear()之后,没有任何元素是有效的,即使没有一个元素被释放。 除了通过重新创建向量中的元素的方法(例如push_backemplace_backresizeinsert )之外,您不应该读取或写入它们。 在调用clear()之后对元素的任何其他访问都是未定义的行为,这可能导致奇怪和不可预测的程序行为(主要是由于破坏了代码不依赖于未定义行为的假设而使编译器混淆)。 永远不要依赖未定义的行为。 永远不要故意调用未定义的行为,即使这在今天“似乎有效”。

暂无
暂无

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

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