2013-11-20 92 views
0

我目前正在用C++編寫容器,但遇到內存泄漏問題。 出於測試目的,我創建了2個版本的主:創建並在一個循環中刪除列表對象(一切OK這裏) 第一個在第一循環 第二個創建對象並刪除它們都在第二個(兩個循環結束後它仍然是程序使用的很多內存)。容器內存泄漏C++

OS:Windows 7的; IDE:CodeBlock 12.11; 編譯器:GNU GCC

代碼 (放置在一個代碼塊,對不起,如果還不清楚的人,只想把這篇文章越短越好)

main.cpp中:

#include <iostream> 
using namespace std; 
#include "planetarySystemContainer.hpp" 

int main() 
{ 
    PlanetarySystemContainer * container; 
    container=new PlanetarySystemContainer(); 
    PlanetarySystem *planet; 
    int i; 
    cin>>i; 
    i=0; 
    for(int i=0; i<10000000; i++) 
    { 
     planet=new PlanetarySystem(); 
     planet->name("blabgs4tegser4labnab"); 
     container->AddAtBegining(planet); 
    } 
    for(int i=0; i<10000000; i++) 
    { 
     container->DeleteFromBegining(); 
    } 
    cin>>i; 
    return 0; 
} 

planetarySystemContainer.hpp:

class PlanetarySystemContainer 
{ 
private: 
    PlanetarySystem *First; 
    PlanetarySystem *Last; 
    int PlanetarySystemQuantity; 
public: 
    PlanetarySystemContainer(); 
    void AddAtBegining(PlanetarySystem *a); 
    void DeleteFromBegining(); 
}; 


planetarySystemContainer.cpp 

#include"planetarySystemContainer.hpp" 
PlanetarySystemContainer::PlanetarySystemContainer() 
    :First(NULL) 
    ,Last(NULL) 
    ,PlanetarySystemQuantity(0) 
{ 
} 

void PlanetarySystemContainer::AddAtBegining(PlanetarySystem *a) 
{ 
    a->SetPrevious(NULL); 
    a->SetNext(First); 
    First=a; 
    if(a->GetNext()==NULL) 
     Last=a; 
    PlanetarySystemQuantity++; 
} 

void PlanetarySystemContainer::DeleteFromBegining() 
{ 
    if(First!=NULL) 
    { 
     if(First->GetNext()!=NULL) 
     { 
      PlanetarySystem* x=First; 
      First=First->GetNext(); 
      First->SetPrevious(NULL); 
      delete x; 
     } 
     else 
     { 
      PlanetarySystem* x=First; 
      First=NULL; 
      Last=NULL; 
      delete x; 
     } 
     PlanetarySystemQuantity--; 

    } 
} 

planetarySystem.hpp:

#include <iostream> 

class PlanetarySystem 
{ 
private: 
    PlanetarySystem* Next; 
    PlanetarySystem* Previous; 
    unsigned int PlanetQuantity; //ilosc obiektow w ukladzie (planet+stacji+asteroid) 
public: 
    PlanetarySystem(); 
    string name; 
    PlanetarySystem *GetNext(); 
    PlanetarySystem *GetPrevious(); 
    void SetNext(PlanetarySystem *ps); 
    void SetPrevious(PlanetarySystem *ps); 
    int GetPlanetQuantity(); 
}; 

planetarySystem.cpp:

#include "planetarySystem.hpp" 

PlanetarySystem::PlanetarySystem() 
    :Next(NULL) 
    ,Previous(NULL) 
    ,PlanetQuantity(0) 
{ 

} 

PlanetarySystem *PlanetarySystem::GetNext() 
{ 
    return Next; 
} 

PlanetarySystem *PlanetarySystem::GetPrevious() 
{ 
    return Previous; 
} 

void PlanetarySystem::SetNext(PlanetarySystem *ps) 
{ 
    Next=ps; 
} 

void PlanetarySystem::SetPrevious(PlanetarySystem *ps) 
{ 
    Previous=ps; 
} 

int PlanetarySystem::GetPlanetQuantity() 
{ 
    return PlanetQuantity; 
}; 
+1

「...它仍然有很多內存使用的程序」根據什麼?非程序員工具(如任務管理器)即使釋放後仍顯示大量正在使用的內存,這是很正常的。 –

+0

不幸的是它是任務管理器。 不應該那麼它發生同樣的漏檢false main.cpp與一個循環? 是我的空DeleteFromBegining();功能好嗎? 我會用盡可能快的速度測試使用免費內存泄漏檢測程序的程序,我將能夠學習它。 – Albert

+1

難道你不能使用其中一個標準容器並將'PlanetarySystem'存儲在該容器中的'std :: unique_ptr <>'內嗎?爲什麼重新發明輪子? – Void

回答

0

我看到第一次看無泄漏。但是,您可以根據插入循環編號輕鬆地爲行星提供一個唯一的名稱,並在析構函數中輸出名稱。

這樣你就可以測試是否所有的行星被刪除。

+0

你也可以使用單元測試框架與內存泄漏檢測像cpputest如果可以讓你睡得更好! –

0

我只是valgrind跑你的代碼在我的Linux機器固定一些編譯時錯誤,減少循環計數,以合理的東西后。泄漏valgrind檢測到泄漏PlanetarySystemContainer。在程序退出之前,您沒有刪除它。

無論如何,正如我在我的評論中提到,你爲什麼重塑通過創建自定義容器的車輪?在我看來,標準容器也可以滿足您的需求。最後,利用諸如std::unique_ptr<>之類的內容來自動化內存管理,或者直接將PlanetarySystem對象存儲在容器中,而不是指向它們的指針,以避免管理內存。

+1

的確,std :: std :: unique_ptr的列表 – paulm