晚上在做毕业设计,遇到了一个问题,正好想要不借第一次写文章这次机会来记录一下这个错误(纯菜)。
写入访问权限冲突这个错误在qt中有几种情况:
-
线程安全问题:如果你的程序是多线程的,并且多个线程尝试同时访问和修改同一个对象或变量,就可能导致写入访问权限冲突。Qt的信号和槽机制是线程安全的,但如果你直接操作对象或变量,就需要确保线程安全。
-
GUI线程与工作线程:在Qt中,GUI相关的操作(如更新界面元素)应该在主线程(也被称为GUI线程)中执行。如果你尝试从工作线程更新GUI元素,可能会导致冲突。
-
资源访问冲突:如果多个线程或进程尝试同时写入同一个文件或网络资源,也可能发生写入访问权限冲突。
-
内存访问违规:如果你的程序试图访问已经被释放的内存,或者超出了分配给变量的内存范围,也可能导致写入访问权限冲突。
Attribute* att;//Attribute是我自己定义的类
void design::on_submit_clicked() {
att->set_attribute_1(ui.Attribute_1->text());
att->set_attribute_2(ui.Attribute_2->text());
att->set_attribute_3(ui.Attribute_3->text());
att->set_attribute_4(ui.Attribute_4->text());
att->set_attribute_5(ui.Attribute_5->text());
att->set_attribute_6(ui.Attribute_6->text());
QMessageBox::about(this, tr("参数提示"), tr("参数设置成功!"));
}
void Attribute::set_attribute_1(const QString& text) {
bool ok = false;
attribute_1 = text.toInt(&ok);//这里出错
if (!ok) {
QMessageBox::warning(NULL, "警告", "输入错误");
return;
}
}
在执行到:attribute_1 = text.toInt(&ok);会报写入访问权限冲突。后来改成了
Attribute att;
void design::on_submit_clicked() {
att.set_attribute_1(ui.Attribute_1->text());
att.set_attribute_2(ui.Attribute_2->text());
att.set_attribute_3(ui.Attribute_3->text());
att.set_attribute_4(ui.Attribute_4->text());
att.set_attribute_5(ui.Attribute_5->text());
att.set_attribute_6(ui.Attribute_6->text());
QMessageBox::about(this, tr("参数提示"), tr("参数设置成功!"));
}
就可以成功运行了。后来查了明白了!!!
在C++中, Attribute att
和 Attribute* att
有根本的不同。
Attribute* att
:- 这里,
Attribute*
是一个指向Attribute
类型对象的指针。 att
是一个指针变量,它存储了一个地址(即内存位置的指针),这个地址指向一个Attribute
类型的对象。- 在你声明这个指针后,它默认是未初始化的,也就是说它指向一个随机的内存位置。如果你试图通过这个指针访问或修改内存,这可能会导致程序崩溃或未定义行为。
- 你需要显式地让这个指针指向一个有效的
Attribute
对象,例如通过new
关键字创建一个新的对象,或者让它指向一个已经存在的Attribute
对象。
- 这里,
Attribute att
:- 这里,
Attribute
是一个类名。 att
是Attribute
类型的一个对象实例。- 在声明的同时,
att
对象会自动调用其构造函数进行初始化(如果有默认构造函数的话)。 - 此后,
att
就拥有了它自己的内存空间,并且可以直接通过对象名访问其公有(public)成员。
- 这里,
如果你的目的是要创建一个 Attribute
类型的对象,并直接使用它,那么使用 Attribute att就好了
。这样做可以确保对象在声明时就被正确初始化,并且你可以直接通过对象名 att
来访问和修改它的成员。(菜就多练)