gpt4 book ai didi

c++ - 从启动 C++ 的函数中删除动态分配的数组

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:34 25 4
gpt4 key购买 nike

我正在用 C++ 编写一个程序,它必须使用来自各种结构(在单独的文件中)的动态分配的数组。很多时候,我需要在函数内部启动这些数组。通常在启动它们之后,我将数据写入结构数组,甚至是结构数组内部的数组,然后稍后使用这些数据。因此我不在函数内部使用 delete。

例如,这是我使用的结构之一,学生结构:

struct Student {
int id; // student ID
char gradeOption; // either G or P
double totalScore;
std::string studentName;
int* rawScores = NULL; // array that holds raw scores for a student
// if no scores are entered for a specific ID, we check for NULL
// we can then set the scores to 0
std::string* finalGrade; // final grade given in course
};

这里是输入原始分数的函数。

// input raw scores for each id
void inputRawScores(int gradedArtifacts, int id, Student* student) {
student[id].rawScores = new int[gradedArtifacts];
for(int i = 0; i < gradedArtifacts; i++) {
std::cin >> student[id].rawScores[i];
}
}

在我的驱动程序文件中,students 也被初始化了一个值。此处显示:

 Student* students = new Student[numOfStudents]; // array of students

问题是我在单独的文件中使用这些原始分数和学生数组进行计算,并将它们用于其他文件和其他方法中的输出。我将如何删除其中的任何一个?

我还意识到使用delete 将删除结构和结构内部的指针,但不会删除指针指向的对象。所以我假设这与第一个问题有关,我不能只在程序结束时发出 delete

编辑:对不起,正如许多其他人指出的那样,我应该说明我对项目的限制。我不允许使用:类、 vector 、结构内部的函数(如构造函数、析构函数)。

最佳答案

不要那样做。

您的系统设计不当,您的struct 应该是一个class 并在内部处理rawScores 内存- 使用std: :vector 将是最简单的部分,但即使您使用常规指针,关键是关于有多少以及它们存储在哪里的信息应该在 class

换句话说,student 结构应该跟踪有多少元素,并根据需要分配/释放内存。它不应该在函数 inputRawScores 中完成 - 该函数很可能会调用 setNumRawScores 的函数并调用 setRawScore(n, value) 的函数>,但不在阅读器函数中分配内存。它属于 student 结构中的成员函数。然后为你的student引入一个析构方法,负责释放内存。

当然,使用 std::vector 会向您“隐藏”所有这些,您只需设置大小(或使用 push_back)。

关于c++ - 从启动 C++ 的函数中删除动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26796707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com