[英]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 == 10
, topval == 9
isFull()
返回false
并且您的push
尝试将值存储在data[10]
,该值越界并损坏内存。
另外,您的push
应该通过const
引用获取value
,或者(如果使用的是C ++ 11)请使用std::move
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.