【发布时间】:2016-08-23 00:23:45
【问题描述】:
几个月前,我使用 Vectors 编写了一个程序。我使用clear() 成员函数来“重置”向量,假设它不仅会清除元素中的项目并重置大小数据成员,而且还会将正在使用的内存归还给堆以前用它。好吧,我偶然发现了一篇关于向量的帖子,说这不是从向量中取回内存的正确方法,因为使用 clear() 不会这样做,但需要使用交换方法:
vector<MyClass>().swap(myVector);
我很好奇为什么我们必须调用交换来删除旧内存?我认为这更像是一种解决方法,因为我们正在使用交换,但正在发生其他事情。是否调用了析构函数?
最后一个问题,我现在读到的所有文章都说clear() 不会释放对象被“销毁”的内存。谁能澄清这是什么意思?我对普通话不熟悉。我假设如果一个对象被破坏了,它就会被清除,并且内存被归还给堆,但这是错误的,那么“破坏”这个词是指只擦除与每个元素相关的位吗?我不知道。任何帮助将不胜感激。谢谢。
【问题讨论】:
-
std::vector::clear() 应该触发向量中元素的析构函数。对于健全性检查,您可以在 MyClass 对象中放置一条打印语句以查看它的发生情况。
-
你很可能误读了所读的内容。
-
当你清除它们时,向量会保持它们的容量,因为它们假设你要向向量添加新元素。因此,保留内存比在添加内存时重新分配内存更有效。
-
通常当你用完一个向量时,你会离开它被声明的范围,然后它将被完全销毁。如果确实需要重置,可以使用
swap方法。 -
需要区分vector本身使用的内存,以及vector中
MyClass对象使用的内存。当你清除向量时,后面的对象被销毁并回收它们的内存,但不是向量本身(它在内部只是一个指针数组)。