这里的内存管理问题。
我得到了结构vector
的Test1
,该结构包含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();
}
我不知道清除该向量会发生什么?所有的结构也会从内存中释放吗?
我想知道清除该向量会发生什么?
根据文档,将删除元素。
所有结构也会从内存中释放吗?
向量的容量不变。
是的,您的建筑物将被摧毁。析构函数将被调用。
但是内存中向量的长度将保持不变。向量具有capacity,如果您打算插入大量数据,则该向量对于设置非常有用。当容量已满时,向量将自动重新分配其内部数组并移动数据。
如果您不对向量进行任何更改(不调整大小,不重写),您的数据仍然可读。
#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
简短回答:mapy
的Test1
字段的内存将被释放,但结构本身的内存仍然保留。
长回答:
清除向量会调用向量内对象的析构函数,但不会释放对象。这是cppreference中的代码段:
使向量的capacity()保持不变
这意味着不释放大小为capacity()
的sizeof(Test1)
个元素。但是,由于调用了析构函数,因此破坏了mapy
之类的内部字段。由于mapy
在堆上拥有一些内存,因此对其进行销毁将释放该内存。结果,指向Test1
外部堆的Test1
的所有内存被释放。
请注意,这种释放仅由于内部字段的析构函数而发生。如果您的结构包含指向内存块的原始指针,并且如果Test1::~Test1
没有明确删除它,则在调用clear()
之后,该内存块将不会被释放。这可能会导致内存泄漏。