c++ - 池类抛出错误

标签 c++ debugging linked-list

我正在尝试实现一个维护链表节点池的池类

虽然分配和释放工作正常,但析构函数抛出异常。

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;
}

是否是由于堆损坏?

最佳答案

您分配一组员工:

vPool = new tEmployee[MAX_POOL];

然后错误地尝试单独删除它们:

delete curr; // Don't do this

在正确删除数组之前:

delete [] vPool;

作为一般规则,每个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];
}

关于c++ - 池类抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346914/

相关文章:

debugging - 在本地服务器端点已经命中一次后,IntelliJ 调试器不会在断点处停止

c++ - 链表问题

C++ 复制构造函数对成员初始化进行双重调用

c++ - 从 C++ 调用静态 C++/CLI 方法

linux - 在远程服务器上安装 spark 的情况下在 eclipse 上本地运行 spark 代码

javascript - 为什么 Google Chrome 的脚本调试器不让我设置断点?

c++ - 动态链接列表 RPG 库存程序 - 帮助(如何链接到类?)

c - 创建列表过程中出现的问题

C++ 和 Mac OSX

C++ 将指针传递给模板函数作为模板