2011-12-01 46 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被称为我将他们存储在链接列表,然后删除这个链表在析构函数 –