使用boost :: ptr_vector在C ++中泄漏内存

时间:2011-09-25 03:16:34

标签: c++ boost memory-leaks

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

我使用_CrtDumpMemoryLeaks();接收泄漏的所有消息,我检查它们中的大多数都与提升相关,我知道它一定是我的问题,但我不明白为什么它会泄漏。

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

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) );
}

layerList的定义如下:

boost::ptr_vector< Layer > layersList;

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

对不起,我发现问题是什么,这真的很愚蠢,真的不存在另一个字。

我忘了处理dinamically Level的类没有分配new,所以在main函数完成之前,它并没有清理所有的数据,所以我的解决方案是在出门前创建一个cleanUp类的方法范围,所以这样所有指针我们都被正确解除分配。

感谢大家的帮助。