引发了异常: 读取访问权限冲突


void MainWindow::on_actTab_SetSize_triggered()
{
    QWDialogSize* dlgTableSize = new QWDialogSize(this);               //这个是自定义对话框
    Qt::WindowFlags flags = dlgTableSize->windowFlags();
    dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);
    dlgTableSize->setRowColumn(theModel->rowCount(), theModel->columnCount());

    int ret = dlgTableSize->exec();
    if (ret == QDialog::Accepted)
    {
        int cols = dlgTableSize->columnCount();
        theModel->setColumnCount(cols);
        int rows = dlgTableSize->rowCount();
        theModel->setRowCount(rows);
    }
    delete dlgTableSize;
}
大佬们,为什么点击acttab时就报错说     引发了异常: 读取访问权限冲突。

在释放 QWDialogSize 对象时出现的悬空指针引起的。
这里用了delete关键字来释放QWDialogSize对象,但是如果释放该对象之后仍然存在指向它的指针,这些指针就会变成悬空指针然后导致读取访问权限冲突。
 
可以使用智能指针,比如std::unique_ptr,这样可以确保对象能正确地释放:

void MainWindow::on_actTab_SetSize_triggered()
{
    std::unique_ptr<QWDialogSize> dlgTableSize(new QWDialogSize(this));   // 使用 std::unique_ptr 管理对象生命周期
    Qt::WindowFlags flags = dlgTableSize->windowFlags();
    dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);
    dlgTableSize->setRowColumn(theModel->rowCount(), theModel->columnCount());

    int ret = dlgTableSize->exec();
    if (ret == QDialog::Accepted)
    {
        int cols = dlgTableSize->columnCount();
        theModel->setColumnCount(cols);
        int rows = dlgTableSize->rowCount();
        theModel->setRowCount(rows);
    }
}

这里不需要调用 delete,对象将在离开作用域时自动被释放。
 
如果答案对您有所帮助,望采纳。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7638812
  • 除此之外, 这篇博客: 从零开始自制计算器中的 辅助类 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    calc辅助类中使用了两个栈,运算符栈与操作数栈。

    private:
        stack<char> operators;
        stack<double> operands;
    

    其中有两个重要的方法:

    bool canCalculate(char sign);
    void calculate(void);
    

    第一个方法将下一个准备进入的符号作为参数,判断是否可以计算操作数栈的前两个数,如果可以的话,使用第二个函数进行计算。

    calculate()会将出栈两个操作数与一个运算符,得出结果后在将其压回操作数栈。

    void calculate(void)
    {
        double post = popAndGetNum();
        char sign = popAndGetSign();
        double pre = popAndGetNum();
        double result = 0.0;
        switch (sign)
        {
            case '+':
                result = pre+post;
            break;
            case '-':
                result = pre-post;
            break;
            case '*':
                result = pre*post;
            break;
            case '/':
                if(fabs(post) < 1e-6)
                {
                    cout<<"Error.Divisor is 0.";
                    exit(EXIT_FAILURE);
                }
                else
                    result = pre / post;
            break;
            case '^':
                result = pow(pre,post);
            break;
            case '%':
                result = static_cast<int>(pre) % static_cast<int>(post);
            break;
        }
        push(result);
    }
    
    bool canCalculate(char sign)
    {
        if(sign == '(' || sign == '[' || sign == '{' || operators.empty())
            return false;
        char t = getSign();
        if(t == '^')
            return true;
        switch (t)
        {
            case '+':
            case '-':
                return sign == '+' || sign == '-';
            case '*':
            case '/':
            case '%':
                return sign == '+' || sign == '-' || sign == '*' || sign == '/' || sign == '%';
        }
        return false;
    }
    

    下面是calc类:

    class calc
    {
    private:
        stack<char> operators;
        stack<double> operands;
    
        char getSign(void)
        {
            return operators.top();
        }
    
        double getNum(void)
        {
            return operands.top();
        }
    
        void popSign(void)
        {
            operators.pop();
        }
    
        void popNum(void)
        {
            operands.pop();
        }
    
        double popAndGetNum(void)
        {
            double num = getNum();
            popNum();
            return num;
        }
    
        char popAndGetSign(void)
        {
            char sign = getSign();
            popSign();
            return sign;
        }
    public:
        void push(double num)
        {
            operands.push(num);
        }
    
        void push(char sign)
        {
            operators.push(sign);
        }
    
        char get(void)
        {
            return getSign();
        }
    
        void pop(void)
        {
            popSign();
        }
    
        double result(void)
        {
            return getNum();
        }
    
        void calculate(void)
        {
            double post = popAndGetNum();
            char sign = popAndGetSign();
            double pre = popAndGetNum();
            double result = 0.0;
            switch (sign)
            {
                case '+':
                    result = pre+post;
                break;
                case '-':
                    result = pre-post;
                break;
                case '*':
                    result = pre*post;
                break;
                case '/':
                    if(fabs(post) < 1e-6)
                    {
                        cout<<"Error.Divisor is 0.";
                        exit(EXIT_FAILURE);
                    }
                    else
                        result = pre / post;
                break;
                case '^':
                    result = pow(pre,post);
                break;
                case '%':
                    result = static_cast<int>(pre) % static_cast<int>(post);
                break;
            }
            push(result);
        }
    
        bool canCalculate(char sign)
        {
            if(sign == '(' || sign == '[' || sign == '{' || operators.empty())
                return false;
            char t = getSign();
            if(t == '^')
                return true;
            switch (t)
            {
                case '+':
                case '-':
                    return sign == '+' || sign == '-';
                case '*':
                case '/':
                case '%':
                    return sign == '+' || sign == '-' || sign == '*' || sign == '/' || sign == '%';
            }
            return false;
        }
    
        bool empty(void)
        {
            return operators.empty();
        }
    };
    

    private封装了一些简单的对两个栈进行操作的工具方法,公有的pop()与get()是对运算符栈进行的操作.因为外部不需要对操作数栈进行操作,由calculate()进行操作,公有的push重载了,可以push到操作数栈或运算符栈.


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^