删除被赋值给基类指针的派生类指针

c++ delete pointer of a derived class which is assigned to a pointer of the base class

本文关键字:指针 派生 基类 赋值 删除      更新时间:2023-10-16

我有以下代码:

/* 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()结束以下错误:"调试断言失败!…_BLOCK_TYPE_IS_VALID (pHead -> nBlockUse)"。

如果在类队列或堆栈的析构函数中取消删除操作的注释(我只取消一个操作的注释!),则没有问题。

我该如何解决这个问题?

删除qp应该和更新一样(这是我的术语))。

delete [] qp;
       ^^

但是在这种特殊情况下,删除qp应该完全删除

你正在删除堆栈基类和队列派生类中的指针。

让你的堆栈类处理所有权,不要在队列

中删除它顺便说一下,

应该使拷贝构造和拷贝赋值是私有的,否则处理它(称为"三原则");否则,这些类很容易被用在不好的地方…


中的代码不只是为了学习,只是使用std::stackstd::queue而不是自己实现这些类

std::stackstd::queue是具有可定制底层容器类型的类模板