假设我有一个std::vector的结构体。如果vector被clear()'d,内存会发生什么?
std::vector<myStruct> vecs; vecs.resize(10000); vecs.clear();
字符串内存会被释放,还是仍然作为可重用的缓冲区附加到vecs变量上?
cgyqldqp1#
内存仍然连接到vector上。这也不太可能。这是必需的。特别是,如果你在调用clear()后再次向vector添加元素,那么vector必须在添加的元素超过之前的10000个之前才能重新分配。如果你想释放内存,通常的方法是用一个空的vector进行交换。C++11还添加了一个shrink_to_fit成员函数,它旨在更直接地提供大致相同的功能,但它是非绑定的(换句话说,它可能会释放额外的内存,但仍然不需要这样做)。
clear()
shrink_to_fit
t8e9dugd2#
vector的内存不一定会被清除。清除后您无法安全地访问元素。为了确保内存被释放,Scott Meyers建议这样做:
vector<myStruct>().swap( vecs );
字符串Cplusplus.com对此有如下看法:从vector中删除所有元素,调用它们各自的析构函数,使容器的大小为0。向量容量不会改变,也不会因为调用此函数而发生重新分配。强制重新分配的典型替代方法是使用swap:.
s1ag04yj3#
对对象调用析构函数,但内存保持分配状态。
2guxujil4#
不,内存没有被释放。在C++11中,可以使用shrink_to_fit方法强制vector释放内存。http://www.cplusplus.com/reference/vector/vector/
neskvpey5#
.resize(0)和.clear()不会释放或重新分配已分配的内存,它们只是将vector大小调整为零,而容量保持不变。如果我们需要清除释放(释放)内存以下工作:Try it online!
.resize(0)
.clear()
v = std::vector<T>();
字符串它调用=操作符的&&重载,该操作符执行移动,类似于swap()解决方案的行为。这种赋值技术在=操作符的&&重载时有效,并且它保证存在于所有C++11 STD库see here中。因此,如果您使用-std=c++11(gcc/clang)或/std:c++11(msvc)开关(或更高版本)编译,我的解决方案保证有效。
=
&&
swap()
-std=c++11
/std:c++11
5条答案
按热度按时间cgyqldqp1#
内存仍然连接到vector上。这也不太可能。这是必需的。特别是,如果你在调用
clear()
后再次向vector添加元素,那么vector必须在添加的元素超过之前的10000个之前才能重新分配。如果你想释放内存,通常的方法是用一个空的vector进行交换。C++11还添加了一个
shrink_to_fit
成员函数,它旨在更直接地提供大致相同的功能,但它是非绑定的(换句话说,它可能会释放额外的内存,但仍然不需要这样做)。t8e9dugd2#
vector的内存不一定会被清除。清除后您无法安全地访问元素。为了确保内存被释放,Scott Meyers建议这样做:
字符串
Cplusplus.com对此有如下看法:
从vector中删除所有元素,调用它们各自的析构函数,使容器的大小为0。
向量容量不会改变,也不会因为调用此函数而发生重新分配。强制重新分配的典型替代方法是使用swap:.
s1ag04yj3#
对对象调用析构函数,但内存保持分配状态。
2guxujil4#
不,内存没有被释放。
在C++11中,可以使用
shrink_to_fit
方法强制vector释放内存。http://www.cplusplus.com/reference/vector/vector/
neskvpey5#
.resize(0)
和.clear()
不会释放或重新分配已分配的内存,它们只是将vector大小调整为零,而容量保持不变。如果我们需要清除释放(释放)内存以下工作:
Try it online!
字符串
它调用
=
操作符的&&
重载,该操作符执行移动,类似于swap()
解决方案的行为。这种赋值技术在
=
操作符的&&
重载时有效,并且它保证存在于所有C++11 STD库see here中。因此,如果您使用-std=c++11
(gcc/clang)或/std:c++11
(msvc)开关(或更高版本)编译,我的解决方案保证有效。