2011-12-01 47 views
0

我想實現一個池類,維護一個鏈表的節點池池類拋出錯誤

儘管分配和釋放工作正常,析構函數拋出異常。

class Pool { 
public: 

    Pool(); 

    ~Pool(); 

    tEmployee *GetFromPool (void); 

    void GiveToPool (tEmployee * pNode); 

    void PrintPoolSize(); 

private: 
    int vTop;       
    tEmployee *vPool;     
    tEmployee *vDeleted; 
}; 

下面是功能的實現

Pool::Pool() 
    :vTop (0), vDeleted (NULL) 
{ 
    vPool = new tEmployee[MAX_POOL]; 
} 

tEmployee* Pool::GetFromPool (void) 
{ 
    if (vDeleted) { 
    tEmployee * temp = vDeleted; 
    vDeleted = vDeleted->next; 

    return temp; 
    } 

    if (vTop == MAX_POOL) { 

    vPool = new tEmployee[MAX_POOL]; 
    vTop = 0; 
    } 

    return vPool + vTop++; 
} 

void Pool::GiveToPool (tEmployee * pNode) 
{ 
    pNode->next = vDeleted; 

    vDeleted = pNode; 
} 

Pool::~Pool() 
{ 
    tEmployee *curr = vDeleted; 
    tEmployee *next = 0; 

    while (curr) { 

    next = curr->next; 
    delete curr; //This line is throwing exception on the second iteration of the loop 
    curr = next; 
    } 

    delete [] vPool; 
} 

是不是由於堆損壞?

+1

你爲什麼要實現自己的鏈表? –

+1

要知道如何正確實現它們 –

+0

'tEmployee'的構造函數是否將該類型的'next'指針初始化爲'NULL'? – sth

回答

2

您分配員工的數組:

vPool = new tEmployee[MAX_POOL]; 

,然後錯誤地試圖刪除工作:

delete [] vPool; 

作爲一般:正確刪除陣列之前

delete curr; // Don't do this 

規則,每個new必須與一個delete匹配;你並不是單獨的員工,所以不要單獨刪除他們。您還需要維護指向您分配的所有數組的指針列表,因此您可以在析構函數中將其全部刪除;目前,除了您分配的最後一個之外,您會泄漏所有這些內容。我會建議這樣的:

std::vector<tEmployee *> vPool; // store all allocated blocks 

tEmployee* GetFromPool() { 
    if (vDeleted) { 
     tEmployee * temp = vDeleted; 
     vDeleted = vDeleted->next; 
     return temp; 
    } 

    if (vTop == MAX_POOL) {  
    vPool.push_back(new tEmployee[MAX_POOL]); // add new block to collection 
    vTop = 0; 
    } 

    return vPool.back() + vTop++; 
} 

~Pool() { 
    for (size_t i = 0; i < vPool.size(); ++i) 
     delete vPool[i]; 
} 
+0

好吧..但是,但我將它們存儲在鏈表中vDeleted ....我怎麼能一次刪除所有vPool分配新的內存時游泳池變空了......並且回收的遊戲將要刪除 –

+1

@SumitJain:查看我添加的示例代碼。重要的一點是,你*不會*單獨刪除'vDeleted'中的項目 - 它們在你分配的一個數組中,並且被數組刪除。 –

+0

你可以解釋我如何泄漏他們,因爲當GiveToPool被稱爲我將他們存儲在鏈接列表,然後刪除這個鏈表在析構函數 –