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

C++自定义IntArray整数数组类setIndex设置值不生效问题排查

问题根因
  • 节点操作使用值拷贝:你在getIndex和setIndex方法中定义的current都是IntArrayIndex值类型,IntArrayIndex current = head;会生成一份和head完全独立的临时副本,后续对current.data的修改只会作用在临时副本上,完全不会修改原链表的节点数据,这是你设置索引0为1、读取依然返回0的直接原因。
  • 递归逻辑错误:getIndex方法中递归调用自身后没有接收返回值,即使遍历到了对应索引的节点,最终也只会返回第一层临时副本的data值。
  • 内存泄漏隐患:IntArrayIndex head = *(new IntArrayIndex());的写法会先在堆上申请节点内存,拷贝完节点值后直接丢弃堆内存的地址,造成内存泄漏,无需用new初始化head成员。
修复代码

IntArray.hpp

#include <stdexcept>
using namespace std;

struct IntArrayIndex {
public:
    IntArrayIndex* next = NULL;
    int data;
    
    IntArrayIndex(int Data) {
        this->data = Data;
    }
    IntArrayIndex() {
        this->data = 0;
    }
};

class IntArray {
public:
    IntArrayIndex head;
    int length;
    
    IntArray() {
        this->length = 1;
    }

    int getIndex(int index) {
        if (index >= length || index < 0) {
            throw invalid_argument("Index out of range.");
        }
        IntArrayIndex* current = &head;
        for (int i = 0; i < index; i++) {
            current = current->next;
        }
        return current->data;
    }
    
    void setIndex(int index, int data) {
        if (index < 0) {
            throw invalid_argument("Index cannot be negative.");
        }
        IntArrayIndex* current = &head;
        // 提前扩容到对应索引
        while (index >= length) {
            if (current->next == NULL) {
                current->next = new IntArrayIndex();
                length++;
            }
            current = current->next;
        }
        // 遍历到目标索引
        current = &head;
        for (int i = 0; i < index; i++) {
            current = current->next;
        }
        current->data = data;
    }

    // 补充析构函数释放内存
    ~IntArray() {
        IntArrayIndex* current = head.next;
        while (current != NULL) {
            IntArrayIndex* next = current->next;
            delete current;
            current = next;
        }
    }
};

main.cpp

#include <iostream>
#include "IntArray.hpp"

int main(int argc, const char * argv[]) {
    IntArray* l = new IntArray();
    l->setIndex(0, 1);
    std::cout << l->getIndex(0) << std::endl;
    delete l;
    return 0;
}
额外说明

原来的递归实现可以保留,但必须把current改为指针类型,并且接收递归返回值,此处改用循环实现逻辑更清晰,也避免递归调用的额外开销。另外不要直接包含.cpp文件,类声明放在.hpp头文件中,主函数只需要引入头文件即可,编译时一起编译两个源文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:39:01