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
相关产品推荐
相关产品推荐

