c++ - 关于 vector 和删除与其关联的内存的问题

标签 c++ vector

几个月前,我使用 Vectors 编写了一个程序。我使用 clear() 成员函数来“重置” vector ,假设它不仅会清除元素中的项目并重置 size 数据成员,而且还会给堆返回之前使用的内存。好吧,我偶然发现了一篇关于 vector 的帖子,它说这不是从 Vector 取回内存的正确方法,因为使用 clear() 不会这样做,但需要使用交换方法:

vector<MyClass>().swap(myVector);

我很好奇为什么我们要调用swap来删除旧内存?我认为这更像是一种解决方法,因为我们正在使用交换,但发生了其他事情。是否调用了析构函数?

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

最佳答案

要回答这个问题,需要把vector直接分配的内存分开从内存通过成员对象间接“拥有”。例如,说 MyClass是一个占用 1000 字节的对象,然后您使用 std::vector<std::unique_ptr<MyClass>> .那么如果该 vector 有 10 个元素,直接分配的内存在 64 位系统上通常接近 10*8=80 字节,而 unique_ptr对象间接拥有 10*1000=10000 字节。

现在,如果您调用 clear()在 vector 上,析构函数在每个 unique_ptr 上被调用元素,因此释放了 10000 个间接拥有的字节。但是,底层数组存储没有被释放,所以 vector 直接拥有的 80 多个字节仍然被分配。 (此时, vector 的 capacity() 至少为 10,但 size() 为 0。)如果您随后调用 vector 的析构函数,也会导致存储数组被释放。

现在,如果你执行

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

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

关于c++ - 关于 vector 和删除与其关联的内存的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39090554/

相关文章:

c++ - 相当于 VirtualAlloc() 的 _set_new_handler?

c++ - 如何使用指针用对象填充 vector

c++ - 在 main 中调用类方法,更改不会在类方法外部持续存在?

C++ vector 初始化

c++ - 如何使用 GMP 创建 float 组?

c++ - 类划分头文件和定义文件

c++ - VC++ express,我该如何解决这个错误?

c++ - 未定义对 CryptoPP::AlignedAllocate(unsigned int) 的引用

c++ - STL vector 的实现

c++ - vector 作为 pthread_create 的输入