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,对象将在离开作用域时自动被释放。
如果答案对您有所帮助,望采纳。
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到操作数栈或运算符栈.