如何修改指针?修复IntArray类set函数及实现拷贝构造函数
修复IntArray类的set函数与拷贝构造函数问题
问题分析
- set函数无效:当前的
set函数只是交换了两个形参的临时值,完全没有对类内部的数组元素进行修改,根本达不到修改指定位置元素的需求。 - 浅拷贝风险:拷贝构造函数仅声明未实现,编译器会生成默认的浅拷贝构造函数,导致两个
IntArray对象共享同一块堆内存,析构时会重复释放内存引发程序错误。
修正方案
1. 重写set函数
修改set函数的逻辑,直接通过索引定位数组元素并修改,同时增加索引合法性检查,避免数组越界访问:
void set(int x, int y) { // 检查索引是否在有效范围内,且数组不为空 if (x >= 0 && x < m_len && m_data != nullptr) { m_data[x] = y; } }
2. 实现深拷贝的拷贝构造函数
为了避免浅拷贝导致的内存问题,手动实现拷贝构造函数,为新对象分配独立的堆内存,并逐一复制原对象的所有元素:
IntArray::IntArray(const IntArray& copy) { m_len = copy.m_len; if (m_len == 0) { m_data = nullptr; return; } // 为新对象分配独立的内存空间 m_data = new int[m_len]; // 复制原对象的每个元素 for (int idx = 0; idx < m_len; ++idx) { m_data[idx] = copy.m_data[idx]; } }
完整修正代码
#include <iostream> using namespace std; class IntArray { private: int* m_data; int m_len; public: IntArray(int = 0, int = 0); ~IntArray(); void print(void); IntArray(const IntArray& copy); // 拷贝构造函数声明 void set(int x, int y); }; IntArray::IntArray(int size, int init) { if (size <= 0) { m_data = nullptr; m_len = 0; } else { m_data = new int[size]; m_len = size; for (int idx = 0; idx < m_len; ++idx) m_data[idx] = init; } } IntArray::~IntArray() { delete[] m_data; } void IntArray::print(void) { for (int idx = 0; idx < m_len; ++idx) cout << m_data[idx] << ' '; cout << endl; } // 深拷贝拷贝构造函数实现 IntArray::IntArray(const IntArray& copy) { m_len = copy.m_len; if (m_len == 0) { m_data = nullptr; return; } m_data = new int[m_len]; for (int idx = 0; idx < m_len; ++idx) { m_data[idx] = copy.m_data[idx]; } } // 修正后的set函数实现 void IntArray::set(int x, int y) { if (x >= 0 && x < m_len && m_data != nullptr) { m_data[x] = y; } } int main() { cout << "a1: "; IntArray a1{10, 100}; a1.print(); cout << "a2: "; IntArray a2{a1}; a2.set(3, 999); a2.set(9, 123); a2.print(); return 0; }
运行结果
运行后输出与预期完全一致:
a1: 100 100 100 100 100 100 100 100 100 100
a2: 100 100 100 999 100 100 100 100 100 123
内容的提问来源于stack exchange,提问作者고건원
相关产品推荐
相关产品推荐

