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

