我有以下代码:
/* Example OOPBEI03.CPP */
#include <iostream>
using namespace std;
typedef char item;
class stack
{
private:
int p;
protected:
item *st;
public:
stack(int m=100)
{
st = new item[m];
p = 0;
}
~stack()
{
delete [] st;
}
void push(item v)
{
st[p++] = v;
}
item pop()
{
return st[--p];
}
int empty()
{
return !p;
}
};
class queue : public stack
{
private:
int q;
item *qp;
public:
queue(int m=50):stack(m)
{
q = 0;
qp = st;
}
~queue()
{
delete qp;
}
item deque()
{
return qp[q++];
}
};
int main()
{
stack s(50);
queue q(20);
s.push('a');
q.push('b');
s.push('c');
q.push('d');
cout<<"pop "<<s.pop()<<endl;
cout<<"pop "<<s.pop()<<endl;
cout<<"deque "<<q.deque()<<endl;
cout<<"deque "<<q.deque()<<endl;
cout<<"empty queue? "<<q.empty()<<endl;
cout<<"empty stack? "<<s.empty()<<endl;
getchar();
return 0;
}
我在Visual Studio的main()结尾处出现以下错误:“Debug Assertion Failed!... _BLOCK_TYPE_IS_VALID(pHead-&gt; nBlockUse)”。
如果我在类队列或堆栈的析构函数中取消注释删除操作(我只取消注释一个操作!),我没有问题。
我该如何解决这个问题?
答案 0 :(得分:1)
你正在删除堆栈基类和队列派生类中的指针。
让你的堆栈类处理所有权,不要在队列中删除它
顺便说一句,你应该复制构造和复制作业私有,否则处理它(称为“三规则”);否则这些类可以很容易地以不良方式使用......
在不仅仅是学习的代码中,只需使用std::stack
和std::queue
而不是自己实现这些类
std::stack
和std::queue
是具有可自定义底层容器类型的类模板
答案 1 :(得分:1)
删除qp
应该与newing(我的术语)相同))。
delete [] qp;
^^
但在这种特殊情况下,应删除qp