2011-09-25 48 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級別它沒有分配新的,所以直到主要功能完成,它不是乾淨的所有數據,所以我的解決方案是創建一個方法來清理班級之前去超出範圍,所以通過這種方式,我們正確地釋放了所有的指針。

感謝大家的幫助。