用栈储存结构指针,释放内存时出现问题。

错误报告一:

img

错误报告二:

img

问题: 网上查找后疑似内存管理出问题,但不知道怎么解决。
错误大概所在:
设置断点一步步排查后,发现自己设立的析构函数可能出了问题,但多次调试后无法解决。
错误发生在析构函数删除new出来的结点指针BTree,但无法解决。

错误发生处代码:

Sqstack::~Sqstack() 
{
    while (_stack.stacksize != 0)
    {
        delete (_stack.Top--);
        _stack.stacksize--;
    }
//    delete _stack.Base;
//    BTree* pf = _stack.Base;
    _stack.Top=_stack.Base = NULL;

    /*delete (*(pf))->lchild;
    delete (*(pf))->rchild;
    delete pf;*/
};

代码:
结构代码:

typedef struct BiTNode
{
    char data;
    struct BiTNode* lchild, * rchild;
    //左右孩子指针。
}BiTNode,*BTree;

队列:

typedef struct stack
{
    //储存指针
    BTree* Base;
    BTree* Top;
    int stacksize;
}Sq;

类声明:

class Sqstack
{
private:
    static const int MAXSIZE = 20;
    Sq _stack;
public:
    Sqstack();
    ~Sqstack();
    //结点入栈
    void Push(const BTree T);
    //判断栈是否为空
    bool Is_empty();
    //栈顶元素脱出
    BTree Pop();
    //得到栈顶元素
    BTree GetTop();
    //
};

类实现方法:

Sqstack::Sqstack()
{
    //栈底
    _stack.Base = new BTree;
    _stack.Top = _stack.Base;
    _stack.stacksize = 0;
}

Sqstack::~Sqstack() 
{
    while (_stack.stacksize != 0)
    {
        delete (_stack.Top--);
        _stack.stacksize--;
    }
//    delete _stack.Base;
//    BTree* pf = _stack.Base;
    _stack.Top=_stack.Base = NULL;

    /*delete (*(pf))->lchild;
    delete (*(pf))->rchild;
    delete pf;*/
};

void Sqstack::Push(const BTree T)
{
    if (_stack.stacksize >= MAXSIZE)
    {
        _stack.Base = (BTree*)realloc(_stack.Base, (_stack.stacksize + MAXSIZE) * sizeof(BTree));
        if (!_stack.Base)
            exit(OVERFLOW);
    }
    *_stack.Top++ = T;
    _stack.stacksize++;
}

bool Sqstack::Is_empty()
{
    //return _stack.Top==_stack.Base;
     return _stack.stacksize == 0;
}

BTree Sqstack::Pop()
{

    if (Is_empty())
    {
        return *_stack.Base;

    }
    _stack.stacksize--;
    return *(--_stack.Top);
}

BTree Sqstack::GetTop()
{
    //如果栈为空栈,则返回值为
    if (Is_empty())
    {
        return *_stack.Base;
    }
    return *(_stack.Top - 1);
}

走读发现几处问题,可能修改后有问题再交流。
1、构造函数里BTree结构需要初始化;
2、析构里用的是delete,它与new是对应的;而push里面用的是realloc,它与malloc/free对应;需要配对使用,不能可混用;
3、MAXSIZE 在构造里就没有分配这么大空间,所以这里push的话,就已经越界了
4、析构里面最后一个Btree结构需要单独释放,因为在构造里申请的,没有计数