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

如何修改指针?修复IntArray类set函数及实现拷贝构造函数

修复IntArray类的set函数与拷贝构造函数问题

问题分析

  1. set函数无效:当前的set函数只是交换了两个形参的临时值,完全没有对类内部的数组元素进行修改,根本达不到修改指定位置元素的需求。
  2. 浅拷贝风险:拷贝构造函数仅声明未实现,编译器会生成默认的浅拷贝构造函数,导致两个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,提问作者고건원

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:55:29