C++:结构体指针内部的指针数组无法删除的问题
问题分析与解决方案
嘿,你这明显是把动态内存释放的对象搞混了,我刚学结构体和指针的时候也踩过这个一模一样的坑!
先捋清楚你的代码逻辑(根据输入行为推测)
从你能用std::cin << stuArray[i].stuScore[j]正常输入分数来看,你的结构体和内存分配逻辑应该是这样的:
// 大概的结构体定义 struct Student { int* stuScore; // 这个指针指向的是一个动态分配的int数组,不是指针数组 }; // 结构体的动态数组 Student* stuArray = new Student[studentNum]; // 给每个学生分配分数数组 for (int i = 0; i < studentNum; ++i) { stuArray[i].stuScore = new int[scoreNum]; // 每个学生有scoreNum个分数 }
为什么delete[] stuArray[count].stuScore[j];会出错?
stuScore[j]只是数组里的单个int值啊!你根本没有给这个单个int单独用new分配内存,真正需要释放的是stuScore这个指针——它才是你用new[]创建的数组的入口。
正确的释放顺序
释放要按先内后外的顺序来,先释放每个学生的分数数组,再释放结构体的动态数组:
// 第一步:释放每个学生的分数数组 for (int i = 0; i < studentNum; ++i) { delete[] stuArray[i].stuScore; // 这里对应你之前的new[]操作 } // 第二步:释放结构体的动态数组 delete[] stuArray;
如果你真的用了指针数组(大概率不是你的情况)
要是你的结构体里是int** stuScore;(指针数组,每个元素指向单个int),那分配的时候得这么写:
stuArray[i].stuScore = new int*[scoreNum]; for (int j = 0; j < scoreNum; ++j) { stuArray[i].stuScore[j] = new int; // 给每个分数单独分配内存 }
这时候输入就得写成std::cin << *stuArray[i].stuScore[j];,但你说输入直接用stuScore[j]就能工作,所以这种情况肯定不是你的场景。
核心要点记牢
- 释放的对象必须是你用
new/new[]分配出来的指针,不是指针指向的元素。 - 分配和释放严格配对:
new[]配delete[],new配delete,顺序反着来(先放内部小内存,再放外部大内存)。
内容的提问来源于stack exchange,提问作者Mike Remley
相关产品推荐
相关产品推荐

