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

问题描述 投票:0回答:3

这里的内存管理问题。

我得到了结构vectorTest1,该结构包含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();
}

我不知道清除该向量会发生什么?所有的结构也会从内存中释放吗?

c++ vector memory-management stdmap
3个回答
0
投票

我想知道清除该向量会发生什么?

根据文档,将删除元素。

所有结构也会从内存中释放吗?

向量的容量不变。


0
投票

是的,您的建筑物将被摧毁。析构函数将被调用。

但是内存中向量的长度将保持不变。向量具有capacity,如果您打算插入大量数据,则该向量对于设置非常有用。当容量已满时,向量将自动重新分配其内部数组并移动数据。

  • vector.resize(int size)修改容量,并将realloc数组
  • vector.capacity()返回实际缓冲区capacity
  • vector.size()返回elements
  • 的实际数量

如果您不对向量进行任何更改(不调整大小,不重写),您的数据仍然可读。

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> a;
    a.push_back(123);
    int *ptr = a.data();
    std::cout << *ptr << std::endl;
    a.clear();
    std::cout << *ptr << std::endl;
}

将输出:

123
123

0
投票

简短回答mapyTest1字段的内存将被释放,但结构本身的内存仍然保留。

长回答

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

使向量的capacity()保持不变

这意味着不释放大小为capacity()sizeof(Test1)个元素。但是,由于调用了析构函数,因此破坏了mapy之类的内部字段。由于mapy在堆上拥有一些内存,因此对其进行销毁将释放该内存。结果,指向Test1外部堆的Test1的所有内存被释放。

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

© www.soinside.com 2019 - 2024. All rights reserved.