std :: vector中的clear()是否会产生内存泄漏?

时间:2017-01-11 15:48:38

标签: c++ c++11 memory-leaks clear stdvector

我的问题几乎是这个问题的延伸:Is std::vector memory freed upon a clear?

这里人们解释说,在调用clear()之后,没有释放为std :: vector元素分配的内存。但是这个内存对于操作系统来说是免费的,以允许其他程序使用它,还是可以让我的程序在其他任何地方使用它?

如果不是(如果内存继续只分配给这个向量而我再也无法访问它了)是不是像指针一样存在内存泄漏?然后清楚()单独使用时这样会完全不安全吗?

如果有人能在这个问题上澄清我,我会很高兴。感谢。

3 个答案:

答案 0 :(得分:7)

  

这里人们解释说,在调用clear()之后,没有释放为std :: vector元素分配的内存。但是这个内存对于操作系统来说是免费的,以允许其他程序使用它,还是可以让我的程序在其他任何地方使用它?

不,内存仍将由std::vector实例保留,并且在向量本身被销毁或shrink_to_fit被称为 1

  

如果没有(如果内存继续只分配给这个向量而我再也无法访问它)是不是像指针一样存在内存泄漏?

不是真的。当矢量被破坏时,内存仍然被释放。

  

那么单独使用时清除()就像这样完全不安全吗?

正如 @ user2079303 雄辩地说出来的那样; clear本质上并不安全,但假设它可以释放内存可能是。

1。 潜在。对shrink_to_fit的调用无法保证释放任何内存。

答案 1 :(得分:7)

  

std :: vector中的clear()是否会产生内存泄漏?

没有

  

但是这个内存对于操作系统来说是免费的,以允许其他程序使用它,还是我的程序可以在其他任何地方使用它?

操作系统可以将内存交换到磁盘,以允许其他程序使用物理内存。

  

如果继续仅为此向量分配内存,我将无法再访问它

您可以通过向向量中添加新对象来重用内存。或者通过摧毁矢量释放它。析构函数绝对保证释放内存。

  

不是像指针一样的内存泄漏吗?

没有。当指向内存的指针丢失时发生内存泄漏。但在这种情况下,向量可以安全地跟踪指针,并在销毁时释放它。

  

那么单独使用时清除()就像这样完全不安全吗?

clear本质上不安全,但假设它会释放内存可能是。

答案 2 :(得分:1)

这不是泄漏。一般来说,泄漏是指您的程序分配资源并且丢失所有句柄。更严格的泄漏定义是当资源分配随时间重复发生时。

clear的简单调用不符合该定义,因为在函数调用之后仍然可以访问std::vector对象;对象不会简单地消失。您仍然可以在其上调用shrink_to_fit,或使用空向量调用swap。甚至那不应该是必要的,因为最终,std::vector将被破坏,析构函数释放占用的内存,或者更确切地说,它解除分配存储,因为发生在操作系统甚至硬件级别不在C ++语言规则的范围内。

如果析构函数运行,因为std::vector由于您的动态内存处理错误而永远不会被销毁,那么std::vector对象本身已经存在导致潜在的泄漏。问题不在于std::vector处理的存储。

请注意,clear仍会导致std::vector 元素立即销毁。这具有重要的效果,即运行他们的析构函数。例如,如果您有一个std::vector<std::string>,并在其上调用clear,则会运行所有单个std::string析构函数,当然 如果实际上存在一些由字符串处理的动态内容(即未使用小字符串优化),则会立即释放存储空间。但它不是由std::vector处理的存储空间,而是由std::string s处理的存储空间。