C ++堆栈模板SIGTRAP错误

时间:2014-07-27 03:43:42

标签: c++ class templates stack

刚开始学习堆栈模板并在我尝试释放内存以调整大小时处理push函数时遇到了问题。该函数一直工作正常,直到达到最大容量,然后立即进入一系列错误消息,我的调试器没有真正接收到。 这是带有导致错误的函数的头文件,以及它调用的函数。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>

class MyStack
{
  private:
  T* data;
  int topVal;
  int capacity;

  public:
  MyStack()
  {
    capacity = 10;
    topVal = 0;
    data = new T[capacity];
  }

  ~MyStack()
  {
    delete [] data;
    data = 0;
  }
  void push(T);
  T pop();
  T top();
  bool isFull();
  bool isEmpty();
  string toString();
};

template <class T>
void MyStack<T>::push(T value)
{
  if(!isFull())
  {
    data[++topVal] = value;
  }
  else
  {
    capacity *= 2;
    T* holdPtr = new T[capacity];
    for(int i = 0; i <= topVal; ++i)
      holdPtr[i] = data[i];
    delete [] data;                 //This is where the error is occurring
    data = holdPtr;
    data[++topVal] = value;
  }
}


template <class T>
bool MyStack<T>::isFull()
{
  if(topVal < capacity)
    return false;
  else
    return true;
}

非常感谢任何帮助。

编辑: 问题解决了!谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

两个(相关)问题:

1)使用空堆栈topval == 0。但是,您的push会将元素放入data[++topVal] - 即data[1]。 <{1}}永远不会被使用。

2)当data[0]topval == 9时,您的capacity == 10会返回isFull()而您的false会尝试将值存储在push中,是超越并破坏记忆。

此外,您的data[10]应该push引用value或(如果您使用的是C ++ 11)使用const