【问题标题】:C++ STL vector use too much memoryC++ STL 向量使用太多内存
【发布时间】:2011-11-07 02:51:24
【问题描述】:

我正在编写一个使用vector 的程序,例如vector<Myclass* > 该向量的长度约为 1000,我使用 for 循环将大约 200 个新对象指针不断推入向量中,并使用 erase() 函数选择其中的 100 个进行擦除。 对于每个被删除的对象,我使用 delete 来释放内存。在析构函数的最后一行我使用 sizeof(this) 来检查内存是否已成功释放。它总是返回 0。

但是我在 ubuntu 上使用 top 命令来检查这个进程的内存使用情况。大约 3 400 次迭代,它将使用 89% 的内存用于我的 2GB 内存实验室顶部。 我猜这是因为 Myclass 对象释放的内存没有被重用,并且向量不断向操作系统询问内存。

有人对此有任何想法吗?

【问题讨论】:

  • 请给我们一些代码示例。
  • 您有内存泄漏。使用标准方法(例如valgrind)来查找/修复它。
  • sizeof(this) 检查内存是否释放成功 - 你有很多要学的,我的朋友。听起来像内存泄漏...
  • 向量拥有它所包含的对象,所以当你从向量中删除它们时,它们的内存应该被自动删除。如果您还要手动删除它,您可能会弄乱堆,这可能是您看到的问题的根源。
  • 一个包含 1000 个元素的指针向量在 64 位机器上将占用大约 8kB。泄漏是未正确删除对象的结果。这不是向量的错。

标签: c++ memory vector


【解决方案1】:

在析构函数的最后一行我使用 sizeof(this) 来检查内存是否释放成功。

sizeof(this)?不确定您真正想知道什么,但sizeof 是一个编译时构造,永远无法告诉您在运行时发生了什么。

但是我在 ubuntu 上使用 top 命令来检查这个进程的内存使用情况。大约 3 400 次迭代,它将使用 89% 的内存用于我的 2GB 内存实验室顶部。我猜这是因为 Myclass 对象释放的内存没有被重用

您可能有内存泄漏。这可能是由例如引起的。由于您的析构函数代码中的错误。

尝试使用--leak-check=full 在valgrind 下运行您的程序。

【讨论】:

    【解决方案2】:

    使用std::shared_ptr<object> 代替常规指针怎么样?

    听起来你可能有内存泄漏。

    【讨论】:

      【解决方案3】:

      向量使用的内存不会超过所需内存的 1.5 倍至 2 倍(我认为大多数实现都是 1.5 倍,但这可能不是标准的)。此外,由于指针只有 4 到 8 个字节,因此指针向量通常不会占用太多空间,至少在您处理数百万个项目之前是这样。

      我很困惑为什么您要在每个循环中添加 200 个对象并删除 100 个对象。除非我误解了你,否则你堆上的对象数量将无限增长。在 3400 次迭代之后,每次添加净 100 个对象,您将拥有 300,000 个对象,即使您没有内存泄漏(尽管这听起来也很可能),一个重要的类也很容易占用 2 GB。

      【讨论】:

      • 对不起这是一个类型,我添加200个对象并删除200个对象。
      【解决方案4】:

      在析构函数的最后一行我使用 sizeof(this) 检查是否 内存已成功释放。它总是返回 0。

      我不认为那是在做你认为它在做的事情。

      但我在 ubuntu 上使用 top 命令来检查内存的使用情况 这个流程。大约 3 400 次迭代,它将使用 89% 的内存 我的 2GB 内存实验室顶部。我猜这是因为释放的内存 来自 Myclass 对象的一些方法和向量没有被重用 继续向操作系统询问内存。

      听起来你有内存泄漏。我怀疑您并没有像您认为的那样删除内存,但我们需要查看您的代码。您的向量中是否有指针,而不仅仅是对象本身?

      【讨论】:

        【解决方案5】:

        没有看到代码,我只能建议使用任何一个

        std::vector<object> 而不是std::vector<object*>

        或

        boost::ptr_vector
        

        【讨论】:

          【解决方案6】:

          在析构函数的最后一行我使用 sizeof(this) 来检查内存是否释放成功。它总是返回 0。

          由于this 是一个指针,sizeof(this) 被评估(在编译时,一如既往)指针的大小,在当今的系统上通常为 4 或 8。此外,sizeof(something) 将永远返回 0。

          如果您发布一些代码,也许我们可以提供更好的建议。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-18
            • 2016-04-01
            • 1970-01-01
            相关资源
            最近更新 更多