2011-09-25 50 views
0

我一直在一个项目中工作,但最近我检查我的程序是否有泄漏,结果是泄漏和很多。在C++中泄漏内存有了boost :: ptr_vector

我用_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; 

也许,是我误会指针的所有权加速是如何工作的,但在例子我最近查,这是通过对象的所有权给ptr_vector一个正确的方法, 我错了吗?

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

感谢您的帮助。

+1

你的代码是正确的,'ptr_vector'将在释放时释放内存。你确定layersList在你调用'_CrtDumpMemoryLeaks'的时候已经被破坏了吗? –

+0

据我所知,一个ptr_vector的破坏可以通过一个layersList.clear()来实现,对吗?_CrtDumpMemoryLeaks在存储那个被清理的ptr_vector的类之后被调用。 –

+0

如何定义图层?它基类使用虚拟析构函数吗? –

回答

2

根据你放置它的位置,但在几乎所有情况下,_CrtDumpMemoryLeaks而不是告诉你使用STL/BOOST智能指针时的真相。它会在STL中看到new的用法,作为内存泄漏。

0

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

我忘了处理dinamically级别它没有分配新的,所以直到主要功能完成,它不是干净的所有数据,所以我的解决方案是创建一个方法来清理班级之前去超出范围,所以通过这种方式,我们正确地释放了所有的指针。

感谢大家的帮助。