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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:04