C++重载赋值运算符operator=后程序运行崩溃问题求助
问题根因
- 野指针非法访问:你重载的
operator=中声明的STUDENT *res是未初始化的野指针,没有指向任何合法的STUDENT对象内存空间,直接执行*res = obj相当于向随机内存地址写入数据,触发内存访问异常,这是程序直接崩溃的直接原因。 - 赋值运算符逻辑不符合规范:拷贝赋值运算符的作用是修改当前调用该运算符的对象本身(即
this指针指向的对象)的成员值,而非创建新对象返回。同时标准赋值运算符的返回值应为自身类型的左值引用,用来支持a = b = c这类连续赋值语义。 - 额外说明:你的代码语法上没有错误所以可以正常编译,但野指针访问属于运行时未定义行为,会直接触发程序崩溃。
修复方案
方法1:手动实现正确的拷贝赋值运算符
替换你原有的错误operator=实现即可:
STUDENT& operator = (STUDENT const &obj) { // 自我赋值判断,避免异常情况 if (this == &obj) { return *this; } // 逐个拷贝成员属性 ID = obj.ID; name = obj.name; birthyear = obj.birthyear; // 返回当前对象的引用 return *this; }
方法2:删除自定义的operator=
你的STUDENT类所有成员都是标准库类型和基础数据类型,没有手动申请的堆内存资源,编译器会自动生成默认的拷贝赋值运算符,完全可以满足拷贝赋值需求,直接删掉你自己写的错误的operator=代码即可正常运行。
内容的提问来源于stack exchange,提问作者Duy Khuong
相关产品推荐
相关产品推荐

