返回含指针成员的类对象触发运行时错误的原因排查
运行时错误根本原因
你触发了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
相关产品推荐
相关产品推荐

