я следующий код:C++ удалить указатель производного класса, который присваивается указатель базового класса
/* 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 следующее сообщение об ошибке: «Debug Assertion Ошибка! ... _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse) ".
Если я раскомментирую операцию удаления либо в деструкторе очереди классов, либо в стеке (я раскомментирую только одну операцию!), У меня нет проблем.
Как я могу это решить?
Я не вижу правило трех/пяти соблюдаются. – chris
Сначала прочитайте о «виртуальных» деструкторах, затем о [правиле трех] (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29) и, наконец, подумайте о том, что происходит, когда вы пытаетесь чтобы освободить указатель дважды. –
@all: Спасибо за ваши ответы. Проблема в том, что этот код находится в моей учебной книге. Сейчас я изучаю C++ в школе. –