VS2022+Qt联合开发遇到“写入访问权限冲突”

晚上在做毕业设计,遇到了一个问题,正好想要不借第一次写文章这次机会来记录一下这个错误(纯菜)。

写入访问权限冲突这个错误在qt中有几种情况:

  1. 线程安全问题:如果你的程序是多线程的,并且多个线程尝试同时访问和修改同一个对象或变量,就可能导致写入访问权限冲突。Qt的信号和槽机制是线程安全的,但如果你直接操作对象或变量,就需要确保线程安全。

  2. GUI线程与工作线程:在Qt中,GUI相关的操作(如更新界面元素)应该在主线程(也被称为GUI线程)中执行。如果你尝试从工作线程更新GUI元素,可能会导致冲突。

  3. 资源访问冲突:如果多个线程或进程尝试同时写入同一个文件或网络资源,也可能发生写入访问权限冲突。

  4. 内存访问违规:如果你的程序试图访问已经被释放的内存,或者超出了分配给变量的内存范围,也可能导致写入访问权限冲突。

    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有根本的不同。

  1. Attribute* att:
    • 这里,Attribute* 是一个指向 Attribute 类型对象的指针。
    • att 是一个指针变量,它存储了一个地址(即内存位置的指针),这个地址指向一个 Attribute 类型的对象。
    • 在你声明这个指针后,它默认是未初始化的,也就是说它指向一个随机的内存位置。如果你试图通过这个指针访问或修改内存,这可能会导致程序崩溃或未定义行为。
    • 你需要显式地让这个指针指向一个有效的 Attribute 对象,例如通过 new 关键字创建一个新的对象,或者让它指向一个已经存在的 Attribute 对象。
  2. Attribute att:
    • 这里,Attribute 是一个类名。
    • att 是 Attribute 类型的一个对象实例。
    • 在声明的同时,att 对象会自动调用其构造函数进行初始化(如果有默认构造函数的话)。
    • 此后,att 就拥有了它自己的内存空间,并且可以直接通过对象名访问其公有(public)成员。

如果你的目的是要创建一个 Attribute 类型的对象,并直接使用它,那么使用 Attribute att就好了。这样做可以确保对象在声明时就被正确初始化,并且你可以直接通过对象名 att 来访问和修改它的成员。(菜就多练)

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值