C++学习遇到的问题
读取字符串的字符出错,内存访问失败
错误
运行报错:0x00007FFE4B3513E7 (vcruntime140d.dll)处(位于 13_ClassesAndObjects.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
调试报错:读取字符串的字符出错
,内存访问失败
报错代码:
#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博客