【问题标题】:Leaking Memory In C++ With boost::ptr_vector使用 boost::ptr_vector 在 C++ 中泄漏内存
【发布时间】:2011-09-25 03:16:34
【问题描述】:

我一直在做一个项目,但是最近我检查我的程序是否有一些泄漏,结果是它正在泄漏并且很多。

我使用_CrtDumpMemoryLeaks();接收所有泄露的消息,我检查了大部分都与boost有关,我知道这一定是我的问题,但我不明白为什么会泄露。

在调试输出中显示了这些行:

Dumping objects ->
{673} normal block at 0x00E075E0, 8 bytes long.
 Data: <H   @e  > 48 92 E0 00 40 65 E0 00 
{671} normal block at 0x00E065C0, 8 bytes long.
 Data: <@e      > 40 65 E0 00 00 00 00 00 
{669} normal block at 0x00E06540, 68 bytes long.
 Data: < e  mountains.pn> C0 65 E0 00 6D 6F 75 6E 74 61 69 6E 73 2E 70 6E 
{665} normal block at 0x00E063B0, 8 bytes long.
 Data: <H       > 48 92 E0 00 00 00 00 00 
{663} normal block at 0x00E09248, 68 bytes long.
 Data: < c  nubes.png   > B0 63 E0 00 6E 75 62 65 73 2E 70 6E 67 00 CD CD 

这让我相信问题在于我在哪里使用这些字符串,而第一次调用这些字符串是在这些行中:

tutorialLevel->addLayerToList("nubes.png", 1600.f, 720.f, 1.0f, 0.0f, 0.1f, true);
tutorialLevel->addLayerToList("mountains.png", 1600.f, 720.f, speedXVectorPanda.at(0), 0.0f, 0.5f, false);

而实际函数addLayerToList是下一个:

void Level::addLayerToList(std::string name, GLfloat widthLayer, GLfloat heightLayer, GLfloat velX, GLfloat velY, 
                GLfloat constantX, bool hasRepetition)
{
    layersList.push_back( new Layer(name, widthLayer, heightLayer, velX, velY, constantX, hasRepetition) );
}

layersList 是这样定义的:

boost::ptr_vector< Layer > layersList;

也许,我误解了指针的所有权如何在 Boost 中工作,但在我最近检查的示例中,这是将对象所有权传递给 ptr_vector 的正确方法,我错了吗?

我的另一个问题是,如果有必要释放向量的指针,或者最好让auto_ptr 做他的工作?

感谢您的帮助。

【问题讨论】:

  • 你的代码是正确的,ptr_vector会在销毁时释放内存。你确定在你调用_CrtDumpMemoryLeaks 时layerList 已经被销毁了吗?
  • 据我所知,ptr_vector 的破坏可以通过layersList.clear() 来完成,对吗?...在​​存储它被清理的ptr_vector 的类之后调用_CrtDumpMemoryLeaks。
  • Layer是如何定义的?它的基类是否使用了虚拟析构函数?
  • 感谢您的评论,我发现了问题所在,我在下面发布了解决方案。

标签: c++ boost memory-leaks


【解决方案1】:

取决于您放置它的位置,但在几乎所有情况下,_CrtDumpMemoryLeaks 在使用 STL/BOOST 智能指针时不会向您展示真相。它将把 STL 中new 的使用视为内存泄漏。

【讨论】:

    【解决方案2】:

    对不起,我发现了问题所在,这真的很愚蠢,真的不存在其他词。

    我忘记了处理动态级别的类没有分配新的,所以在主函数完成之前,它并没有清理所有数据,所以我的解决方案是在出去之前创建一个清理类的方法范围,所以通过这种方式,我们正确地释放了所有指针。

    感谢大家的帮助。

    【讨论】:

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