我的问题几乎是这个问题的延伸:Is std::vector memory freed upon a clear?
这里人们解释说,在调用clear()之后,没有释放为std :: vector元素分配的内存。但是这个内存对于操作系统来说是免费的,以允许其他程序使用它,还是可以让我的程序在其他任何地方使用它?
如果不是(如果内存继续只分配给这个向量而我再也无法访问它了)是不是像指针一样存在内存泄漏?然后清楚()单独使用时这样会完全不安全吗?
如果有人能在这个问题上澄清我,我会很高兴。感谢。
答案 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处理的存储空间。