鱼非愚而为瑜 2023-04-25 11:18 采纳率: 50%
浏览 22
已结题

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

错误报告一:

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);
}

  • 写回答

2条回答 默认 最新

  • 韩楚风 数据库领域优质创作者 2023-04-26 13:22
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 已采纳回答 4月27日
  • 创建了问题 4月25日

悬赏问题

  • ¥15 哪个tomcat中startup一直一闪而过 找不出问题
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网