00_C++学习遇到的问题

C++学习遇到的问题

读取字符串的字符出错,内存访问失败

错误

运行报错0x00007FFE4B3513E7 (vcruntime140d.dll)处(位于 13_ClassesAndObjects.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

image-20230110113615536

调试报错读取字符串的字符出错内存访问失败

image-20230110114226315

报错代码:

#include<iostream>
using namespace std;
class Person {
public:
	//姓名设置可读可写
	void setName(string name) {
		uname = name;
	}
	string getName() {
		return uname;
	}
	//获取年龄
	int getAge() {
		return uage;
	}
	//设置年龄
	void setAge(int age) {
		if (age < 0 || age>150) {
			uage = 0;
			cout << "你个老妖精" << endl;
			return;
		}
		uage = age;
	}
	//情人设置可写
	void setLove(string love) {
		ulove = love;
	}
private:
	string uname;//可读可写 姓名
	int uage;//只读  年龄	//如果放在情人前面报错
	string ulove;//只写 情人
	//下面这个顺序不报错
	//string ulove;//只写 情人
	//int uage;//只读  年龄	//如果放在情人前面报错

	
};

void privateAttribute() {
  ///报错原因代码部分
	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名:" << p.getName() << endl;
	//年龄设置
	p.setAge(21);
	cout << "年龄:" << p.getAge() << endl;
	//情人设置
	p.setLove("苍井空");
	//cout << "情人:" << p.ulove << endl;//只写属性,不可读取

}

错误原因

未使用显示的方式new对象导致对象调用malloc,分配内存后未调用构造函数初始化

详细原因:
使用结构体变量类型定义一个结构体时(Type a),因为工程环境或者其他原因导致编译器对该变量只使用malloc分配内存,没有调用相应的构造函数对内部的数据初始化,比如重要的指针数据,和基于指针的容器数据string或其他容器。

解决方法

​ 程序员需要显式的使用new构造对象(Type *a=new Type()),不管是结构体对象还是类对象,也就是用指针代替值对象。

注意点:
显式使用了new以后就需要用指针指向该内存,所以在使用对象时,为了避免出现意外的只有malloc没有构造的情况,需要使用指针替代值对象,传值的时候只需要将指针解引用就可以。

修改代码

void privateAttribute() {
	Person *p=new Person();
	//姓名设置
	p->setName("张三");
	cout << "姓名:" << p->getName() << endl;
	//年龄设置
	p->setAge(21);
	cout << "年龄:" << p->getAge() << endl;
	//情人设置
	p->setLove("苍井空");
	//cout << "情人:" << p->ulove << endl;//只写属性,不可读取

}

参考CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值