错误报告一:
错误报告二:
问题: 网上查找后疑似内存管理出问题,但不知道怎么解决。
错误大概所在:
设置断点一步步排查后,发现自己设立的析构函数可能出了问题,但多次调试后无法解决。
错误发生在析构函数删除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);
}