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

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;
}

问题分析与修复方案

  1. resize方法的致命错误:
    你在intPtr = newArr;之后执行了delete[] newArr;,这会直接释放刚分配的新数组内存,导致intPtr变成野指针,后续访问数组会触发未定义行为(比如崩溃、乱码)。必须删除这行错误的释放代码。

  2. add方法逻辑冗余:
    不管是否触发resize,赋值和totElements++的操作是重复的,可以简化代码,避免冗余。

  3. 缺少索引合法性检查:
    get方法没有验证传入的index是否在0 <= index < totElements范围内,越界访问会导致程序异常。

  4. 内存泄漏风险:
    类没有析构函数,intPtr指向的动态数组在对象销毁时不会被释放,造成内存泄漏。

  5. 头文件命名空间污染:
    头文件中使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:43:37