You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:06:00