刚开始学习堆栈模板并在我尝试释放内存以调整大小时处理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;
}
非常感谢任何帮助。
编辑: 问题解决了!谢谢你的帮助!
答案 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
。