【问题标题】:STL vector taking up too much memorySTL 向量占用过多内存
【发布时间】:2011-01-19 00:46:33
【问题描述】:

我在我的 SDL 程序中使用了 STL 向量。它看起来像这样:vector vec;这使得向量可以包含指向 Bullet 对象的指针。当我运行我的程序时,我一次只添加一个项目:vec.push_back(new_bullet); (new_bullet 是指向“新”Bullet 对象的指针。然后在以下函数中,我使用以下函数擦除对象: vec.erase(...); vec.size() 表明项目正在被正确推送和弹出。我我正在运行 Ubuntu 9.10,系统监视器显示我的程序内存使用量正在缓慢增加。是我的程序还是我缺少关于 STL 向量的东西?

【问题讨论】:

  • 如果你想存储指向对象的指针,我推荐Boost指针容器库:boost.org/doc/libs/1_42_0/libs/ptr_container/doc/…这让你从内存管理的负担中解放出来。 (就目前而言,我怀疑您的向量是否非常安全,因为不能保证您循环遍历向量并在其销毁时删除每个元素。)

标签: c++ memory stl vector


【解决方案1】:

当您从向量中删除“子弹”对象时,听起来您并没有 deleteing。

【讨论】:

    【解决方案2】:

    erase() 仅从向量中删除一个元素,如果该元素是指针,它不会删除指向的内存。这是有道理的......假设你有一个vector<const char *> 的字符串文字并做了v.erase(i);你不能删除const char *

    然而,erase()为移除的元素调用析构函数。因此,如果您使用一种“指针对象”而不是指针,它可以在销毁时释放内存。如果你有兴趣,你应该看看boost::shared_ptr,它实现了引用计数的垃圾回收。

    【讨论】:

    • “指针对象”通常被称为智能指针
    【解决方案3】:

    如果您只是添加到数组的末尾并且担心内存碎片,您可能希望使用std::list 来代替。唯一的问题是,如果列表访问不是在开头,则需要 O(n) 时间。

    在将子弹从矢量中拉出后,您是否在子弹上调用 free()/delete?

    【讨论】:

    • std::list<t>::end() 是一个 O(1) 操作,因为列表会记住访问元素的两侧。只有列表中间的元素需要 O(n) 时间。
    • 另外,问题不在于内存碎片,而在于增加内存使用量。
    【解决方案4】:

    虽然我猜原始发帖人并没有释放他的“弹出”指针(pop 不会为您这样做),但 std::vector 有另一个“功能”可能会影响它的问题。 std::vector 过度分配空间,使得每个 push_back 都不需要重新分配和复制现有内容。换句话说,用于向量的空间通常比 .size() 返回的空间要多。

    如果您希望 std::vector 占用的空间不超过它容纳其元素所需的空间,请查看 shrink-to-fit 习惯用法。如果您不断地操纵矢量,这将没有用,但是一旦您加载了所有内容,它可以节省一些空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多