【问题标题】:Memory leak (sort of) with a static std::vector带有静态 std::vector 的内存泄漏(有点)
【发布时间】:2010-10-28 06:00:00
【问题描述】:

我在课堂上有一个静态的std::vector。当我使用微软的内存泄漏检测工具时:

_CrtMemState state;
_CrtMemCheckpoint( & state);
_CrtMemDumpAllObjectsSince( & state );

在我将内容插入向量后,它会报告泄漏。这对我来说很有意义,因为当将某些内容插入向量时会分配新空间。在程序终止之前,这个空间不会被释放(因为向量是静态的)。是这样吗?

在包含向量的类的析构函数中,我正在删除放入向量中的对象。但是,插入发生时分配的内存仍然存在。有没有办法删除这个空间?

【问题讨论】:

  • 您能否展示将内容插入向量中的代码以及您引用的删除您放入向量中的对象的代码?
  • 如果您有兴趣,我可以,但是 James 和 ilproxyil 帮我解决了这个问题。如果您有兴趣,请告诉我。

标签: c++ memory stl vector memory-leaks


【解决方案1】:

您可以将向量与空向量交换 - 这将释放内存。

另见Q: Shrinking a vector

【讨论】:

【解决方案2】:

补充詹姆斯所写的内容。他的意思是这样做:

std::vector<T>().swap(v);

其中 'v' 是要释放其内存的向量。

【讨论】:

    【解决方案3】:

    这只是 Visual Studio 的一个怪癖。矢量析构函数确实释放了内存,但内存检查模块并不总是发现它,所以它会抱怨。有点痛,但没什么好担心的。

    【讨论】:

    • 不是 VS 的怪癖。他的向量是静态的。在 CRT 释放静电之前,他正在检查是否有泄漏。
    • 这就是怪癖。 VS 包含了以前称为 Nu Mega Bounds Checker 的精简版本。旧版本的 Bounds Checker 过去运行良好,但与 VS7.x 结合的版本出错了。它会定期报告静态对象中不存在的内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2017-02-19
    • 1970-01-01
    • 2016-02-07
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多