C++ 关于向量和删除与其相关的内存的问题

C++ 关于向量和删除与其相关的内存的问题,c++,vector,C++,Vector,几个月前我用向量写了一个程序。我使用clear()member函数来“重置”向量,假设它不仅会清除元素中的项并重置大小数据成员,而且还会将以前与它一起使用的内存还给堆。好吧,我偶然发现了一篇关于向量的帖子,上面说这不是从向量中获取内存的正确方法,因为使用clear()无法做到这一点,但需要使用swap方法: vector<MyClass>().swap(myVector); vector().swap(myVector); 我很好奇为什么我们必须调用交换来删除旧内存?我认为这更像

几个月前我用向量写了一个程序。我使用
clear()
member函数来“重置”向量,假设它不仅会清除元素中的项并重置大小数据成员,而且还会将以前与它一起使用的内存还给堆。好吧,我偶然发现了一篇关于向量的帖子,上面说这不是从向量中获取内存的正确方法,因为使用
clear()
无法做到这一点,但需要使用swap方法:

vector<MyClass>().swap(myVector);
vector().swap(myVector);
我很好奇为什么我们必须调用交换来删除旧内存?我认为这更像是一种解决办法,因为我们正在使用掉期,但发生了其他事情。是否调用了析构函数


最后一个问题,我现在读到的所有文章都说,
clear()
不会释放对象被“销毁”的内存。有人能澄清这是什么意思吗?我不熟悉方言。我假设如果一个对象被销毁,它会被清除,内存会返回到堆中,但这是错误的,那么“destroy”一词是指仅仅擦除与每个元素相关的位吗?我不确定。任何帮助都将不胜感激。谢谢。

要回答这个问题,您需要将
向量直接分配的内存与通过成员对象间接“拥有”的内存分开。例如,假设
MyClass
是一个占用1000字节的对象,然后使用
std::vector
。然后,如果该向量有10个元素,则直接分配的内存在64位系统上通常接近10*8=80字节,而
unique\u ptr
对象间接拥有10*1000=10000字节

现在,如果在向量上调用
clear()
,则会在每个
unique\u ptr
元素上调用析构函数,从而释放10000个间接拥有的字节。但是,底层阵列存储没有被释放,因此向量直接拥有的80多个字节仍然被分配。(此时,向量的
容量()
至少为10,但
大小()
为0。)如果随后调用向量的析构函数,也会导致存储阵列被释放

现在,如果你执行

std::vector<std::unique_ptr<MyClass>>().swap(v);
std::vector().swap(v);

让我们分析一下它的作用:首先,创建一个临时向量对象,它没有分配的数组和0的
capacity()。现在,
swap
v
的底层数组传输到临时向量,并将空数组或空数组从临时向量交换到
v
。最后,在表达式末尾,临时对象超出范围,因此调用其析构函数。这会导致调用以前属于
v
的任何元素的析构函数,然后释放以前属于
v
的底层数组存储。因此,在此结束时,
v.capacity()
为0,以前属于
v
的所有内存都被释放,无论它是由
v
直接分配的,还是通过存储的
unique\ptr
对象间接属于它的。

回答这个问题,您需要将
向量直接分配的内存与通过成员对象间接“拥有”的内存分开。例如,假设
MyClass
是一个占用1000字节的对象,然后使用
std::vector
。然后,如果该向量有10个元素,则直接分配的内存在64位系统上通常接近10*8=80字节,而
unique\u ptr
对象间接拥有10*1000=10000字节

现在,如果在向量上调用
clear()
,则会在每个
unique\u ptr
元素上调用析构函数,从而释放10000个间接拥有的字节。但是,底层阵列存储没有被释放,因此向量直接拥有的80多个字节仍然被分配。(此时,向量的
容量()
至少为10,但
大小()
为0。)如果随后调用向量的析构函数,也会导致存储阵列被释放

现在,如果你执行

std::vector<std::unique_ptr<MyClass>>().swap(v);
std::vector().swap(v);

让我们分析一下它的作用:首先,创建一个临时向量对象,它没有分配的数组和0的
capacity()。现在,
swap
v
的底层数组传输到临时向量,并将空数组或空数组从临时向量交换到
v
。最后,在表达式末尾,临时对象超出范围,因此调用其析构函数。这会导致调用以前属于
v
的任何元素的析构函数,然后释放以前属于
v
的底层数组存储。因此在此结束时,
v.capacity()
为0,先前属于
v
的所有内存都被释放,它是由
v
直接分配的,还是通过存储的
unique\u ptr
对象间接属于它。

一个
向量
有一个称为
容量
的关联量,这意味着它已经为这么多元素分配了足够的内存,即使它目前实际上并不包含那么多元素

如果在不超过容量的情况下从向量中添加或删除元素,则不会分配或释放内存;独立元素的构造函数和析构函数在已经分配的空间上运行

clear()
函数不会改变容量。然而,
vector::swap()
的通常实现也交换了向量的容量;因此,与空向量交换将导致原始向量具有defa