c++堆栈模板SIGTRAP错误

C++ Stack Template SIGTRAP Error

本文关键字:SIGTRAP 错误 堆栈 c++      更新时间:2023-10-16

刚刚开始学习堆栈模板,每当我尝试释放内存来调整大小时,在使用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)当堆栈为空时,topval == 0。但是你的push把元素放到data[++topVal]中,也就是data[1]data[0]从未使用过。

2)当topval == 9capacity == 10时,您的isFull()返回false,而您的push试图将值存储在data[10]中,这是越界的并且会损坏内存。

此外,您的push应该通过const参考value或(如果您使用c++ 11)使用std::move