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

返回含指针成员的类对象触发运行时错误的原因排查

运行时错误根本原因

你触发了C++中管理动态内存类的常见错误:违反了**三法则(Rule of Three)**规范,且使用了默认生成的浅拷贝赋值运算符:

  • 你已经自定义了析构函数、深拷贝构造函数,但没有自定义拷贝赋值运算符operator=
  • 执行merged_arr = arr1.merge_Array(arr2);时,编译器会自动生成默认的浅拷贝赋值运算符,仅会将临时返回对象的num指针地址、length值逐位复制给merged_arr
  • 赋值完成后,merge_Array返回的临时对象会被销毁,其析构函数会delete[]掉num指向的堆内存,此时merged_arr的num就变成了悬空野指针
  • 后续调用display访问数组、或者程序结束merged_arr析构时重复释放同一块内存,直接触发运行时错误。
修复方法

方法1:补全深拷贝赋值运算符(推荐,彻底解决类的赋值问题)

在Array类的public区域添加如下赋值运算符重载实现:

Array& operator=(const Array& obj) {
    // 处理自赋值的边界情况
    if (this == &obj) {
        return *this;
    }
    // 释放当前对象已有的内存,避免内存泄漏
    delete[] num;
    // 深拷贝目标对象的内容
    length = obj.length;
    num = new int[length];
    for (int i = 0; i < length; ++i) {
        num[i] = obj.num[i];
    }
    return *this;
}

方法2:修改初始化逻辑,避开赋值操作

将main函数中的初始化逻辑从:

Array merged_arr;
merged_arr = arr1.merge_Array(arr2);

修改为:

Array merged_arr = arr1.merge_Array(arr2);

此时会直接调用你已经实现的深拷贝构造函数初始化merged_arr,不会触发赋值操作,也可以解决当前运行时错误。

额外逻辑优化提示

你当前merge_Array方法中第二个填充arr2元素的循环是倒序插入,会导致合并后的数组中arr2的元素是逆序的,如果需要保持arr2原有顺序,可以将循环修改为:

for (int c = 0; c < arr2.length; c++) {
    merge_a.num[this->length + c] = arr2.num[c];
}

内容的提问来源于stack exchange,提问作者Zen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:02