繁体   English   中英

C ++堆栈模板SIGTRAP错误

[英]C++ Stack Template SIGTRAP Error

刚开始学习堆栈模板时,每当我尝试释放内存以调整大小时,在使用推功能时就会遇到问题。 该功能一直很好,直到达到最大容量为止,然后立即进入一系列错误消息,这些消息不是我的调试器真正接收到的。 这是带有导致错误的函数的头文件,以及它所调用的函数。

#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 == 9并且capacity == 10topval == 9 isFull()返回false并且您的push尝试将值存储在data[10] ,该值越界并损坏内存。

另外,您的push应该通过const引用获取value ,或者(如果使用的是C ++ 11)请使用std::move

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM