C++动态数组IntVector类resize方法报错求助
修复IntVector类resize方法的问题
我需要在C++中创建一个用于int类型动态数组的IntVector类,要求包含add、get、resize、size方法。以下是我目前的代码,但resize方法存在问题,出现大量报错,请问我遗漏了什么?
原头文件代码
//header file #pragma once #ifndef IntVector_h #define IntVector_h using namespace std; class IntVector { private: int* intPtr; int vectSize; int totElements; public: IntVector(); void add(int); int get(int); void resize(); int size(); }; #endif
原实现代码
//implementation #include "IntVector.h" #include <iostream> #include <string> using namespace std; IntVector::IntVector() { vectSize = 1; totElements = 0; intPtr = new int[vectSize]; } void IntVector::add(int num) { if (vectSize == totElements) { resize(); intPtr[totElements] = num; totElements++; } else { intPtr[totElements] = num; totElements++; } } int IntVector::get(int index) { return intPtr[index]; } void IntVector::resize() { vectSize *= 2; int* newArr = new int[vectSize]; for (int i = 0; i < (vectSize / 2); i++) { newArr[i] = intPtr[i]; } delete[] intPtr; intPtr = newArr; delete[] newArr; } int IntVector::size() { return totElements; }
问题分析与修复方案
resize方法的致命错误:
你在intPtr = newArr;之后执行了delete[] newArr;,这会直接释放刚分配的新数组内存,导致intPtr变成野指针,后续访问数组会触发未定义行为(比如崩溃、乱码)。必须删除这行错误的释放代码。add方法逻辑冗余:
不管是否触发resize,赋值和totElements++的操作是重复的,可以简化代码,避免冗余。缺少索引合法性检查:
get方法没有验证传入的index是否在0 <= index < totElements范围内,越界访问会导致程序异常。内存泄漏风险:
类没有析构函数,intPtr指向的动态数组在对象销毁时不会被释放,造成内存泄漏。头文件命名空间污染:
头文件中使用using namespace std;会污染全局命名空间,建议移除,在实现文件中使用即可。
修复后的完整代码
头文件(IntVector.h)
#pragma once #ifndef IntVector_h #define IntVector_h class IntVector { private: int* intPtr; int vectSize; int totElements; public: IntVector(); ~IntVector(); // 添加析构函数 void add(int); int get(int); void resize(); int size(); }; #endif
实现文件(IntVector.cpp)
#include "IntVector.h" #include <iostream> using namespace std; IntVector::IntVector() { vectSize = 1; totElements = 0; intPtr = new int[vectSize]; } IntVector::~IntVector() { delete[] intPtr; // 释放动态数组内存 } void IntVector::add(int num) { if (vectSize == totElements) { resize(); } intPtr[totElements] = num; totElements++; } int IntVector::get(int index) { // 索引合法性检查 if (index < 0 || index >= totElements) { cerr << "Error: Index out of bounds!" << endl; // 可以选择抛出异常或返回一个默认值,这里返回0作为示例 return 0; } return intPtr[index]; } void IntVector::resize() { vectSize *= 2; int* newArr = new int[vectSize]; // 复制原数组元素,用totElements更准确(避免原数组未填满的情况) for (int i = 0; i < totElements; i++) { newArr[i] = intPtr[i]; } delete[] intPtr; intPtr = newArr; } int IntVector::size() { return totElements; }
内容的提问来源于stack exchange,提问作者Legend7305
相关产品推荐
相关产品推荐

