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

C++内存读取失败求助:类指针数组未初始化致非法访问

问题原因分析与修复方案

这个内存读取失败的错误,核心原因是你在访问未初始化的野指针,具体细节和修复方法如下:

1. 直接触发错误的核心问题

你在b_course的构造函数里,只创建了一个b_class*类型的指针数组,但数组里的每个指针都没有指向任何有效的b_class对象。这些指针的初始值是随机的内存地址(比如你看到的0x7000000000000000,这是一个完全无效的内存区域),当你执行classes[i]->time_viewed=0;时,相当于试图通过野指针去读写内存,必然会触发内存访问错误。

2. 额外的小问题:数组分配的冗余计算

你写的classes=new b_class*[num_of_classes*sizeof(b_class*)];存在多余的计算——new T[N]语法会自动计算出N个T类型元素所需的总内存,不需要手动乘以sizeof(T)。这里多乘的结果会让你创建的数组大小远大于实际需要,虽然不是触发当前错误的直接原因,但会造成不必要的内存浪费。

3. 修复后的构造函数代码

你需要在循环中为每个数组元素分配一个b_class对象,利用b_class的带参构造函数可以同时完成parent_course和time_viewed的初始化,代码如下:

b_course::b_course(int course_id,int num_of_classes) {
    this->course_id = course_id;
    this->num_of_classes = num_of_classes;
    // 修正数组分配的计算,不需要乘sizeof(b_class*)
    classes = new b_class*[num_of_classes];
    for (int i = 0; i < num_of_classes; i++) {
        // 为每个指针分配有效的b_class对象,同时初始化成员
        classes[i] = new b_class(course_id);
        // 这里不需要再单独赋值time_viewed,因为构造函数已经设为0了
    }
}

4. 额外提醒

为了避免内存泄漏,记得在b_course的析构函数中释放这些分配的内存:

b_course::~b_course() {
    for (int i = 0; i < num_of_classes; i++) {
        delete classes[i]; // 先释放每个b_class对象
    }
    delete[] classes; // 再释放指针数组
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:31:36