C++ 如何清除为';在C++;?

C++ 如何清除为';在C++;?,c++,memory-management,linked-list,free,C++,Memory Management,Linked List,Free,在您阅读我的代码之前,我希望每个人都知道我没有在任何地方使用我的代码,这就是为什么它没有太多注释的原因。这只是我写的一个例子来问这个问题,它按照我想要的方式工作。请随便试用 我有一个关于删除功能的问题。删除[]pTemp->TOP3成绩;是否实际删除/释放所有数组项?它知道在3个元素之后停止吗?怎么用?如果内存中的某些数据与前3个数据可能是相同的数据(或相同类型的数据),该怎么办?3是否秘密地传递到delete函数中,以便它知道何时停止?还是只删除第一个元素pTemp->top3Grades[0

在您阅读我的代码之前,我希望每个人都知道我没有在任何地方使用我的代码,这就是为什么它没有太多注释的原因。这只是我写的一个例子来问这个问题,它按照我想要的方式工作。请随便试用

我有一个关于删除功能的问题。删除[]pTemp->TOP3成绩;是否实际删除/释放所有数组项?它知道在3个元素之后停止吗?怎么用?如果内存中的某些数据与前3个数据可能是相同的数据(或相同类型的数据),该怎么办?3是否秘密地传递到delete函数中,以便它知道何时停止?还是只删除第一个元素pTemp->top3Grades[0]

如果可能的话,我如何检查它是否被删除?我使用XCode,如果有帮助的话,它附带了一个调试器

#include <iostream>

using namespace std;

struct Students{
int idNum;
int age;
Students* pNext;
int* top3Grades;
};

void deleteAllStudents(Students* *head){
Students* pTemp = *head;
while (pTemp!=NULL) {
    *head = pTemp->pNext;
    delete[] pTemp->top3Grades; //Does this eliminate all 3 elments
                                //or just the first? How would you
                                //check if it is?

    delete (pTemp);             //Might as well ask...how I can see
                                //this was deleted/freed up?
    pTemp=*head;
}
}

void addStudent(Students* *head, int id, int age, int grade1, int grade2, int grade3){
Students* studentEntry= new Students;
studentEntry->top3Grades= new int[3];   // Yes I could have set this as static when
                                        // defining it in struct up above, but
                                        // this way is related to my question later
studentEntry->top3Grades[0] = grade1;
studentEntry->top3Grades[1] = grade2;
studentEntry->top3Grades[2] = grade3;

studentEntry-> idNum = id;
studentEntry-> age = age;
studentEntry->pNext=NULL;

Students* pTemp;

pTemp = *head;

if (*head==NULL) {
    *head = studentEntry;
} else{
    while (pTemp->pNext!=NULL) {
        pTemp= pTemp->pNext;
    }
    pTemp-> pNext= studentEntry;
}

}

void dispalyAllStudents(Students* *head){
Students* pTemp;

pTemp = *head;

while (pTemp!=NULL) {
    cout<<"ID #: "<<pTemp->idNum<<" Age: "<<pTemp->age<<endl;
    cout<<"Best grades are "
    <<pTemp->top3Grades[0]<<" "
    <<pTemp->top3Grades[1]<<" "
    <<pTemp->top3Grades[2]
    <<endl<<endl;
    pTemp= pTemp->pNext;
}

}


int main()
{
int inputNum, studentID, studentAge, bestGrade1, bestGrade2, bestGrade3;

Students* pHead=NULL;

cout<< "How many records do you want to input? ";
cin >> inputNum;

for (int i = 0; i<inputNum; i++) {
    cout<<endl;
    cout<<"Enter ID Number: ";
    cin>>studentID;
    cout<<"Enter age: ";
    cin>>studentAge;
    cout<<"Enter first best grade: ";
    cin>>bestGrade1;
    cout<<"Enter second best grade: ";
    cin>>bestGrade2;
    cout<<"Enter third best grade: ";
    cin>>bestGrade3;
    addStudent(&pHead, studentID, studentAge, bestGrade1, bestGrade2, bestGrade3);
}

cout<< "--------"<<endl;

dispalyAllStudents(&pHead);

deleteAllStudents(&pHead);
return 0;
}
#包括
使用名称空间std;
结构学生{
int-idNum;
智力年龄;
学生*pNext;
国际*前三名;
};
无效删除所有学生(学生**头){
学生*pTemp=*头;
while(pTemp!=NULL){
*head=pTemp->pNext;
删除[]pTemp->top3Grades;//这会消除所有3个元素吗
//还是第一次?你会怎么做
//看看是不是?
delete(pTemp);//不妨问问……我怎么看
//这是否已被删除/释放?
pTemp=*头;
}
}
void addStudent(学生**负责人、内部id、内部年龄、内部一年级、内部二年级、内部三年级){
学生*学生中心=新生;
studentEntry->top3Grades=new int[3];//是的,当
//在上面的struct中定义它,但是
//这与我稍后的问题有关
学生入学->前三名成绩[0]=一年级;
学生入学->前三名成绩[1]=二年级;
学生入学->前三名成绩[2]=三年级;
studentry->idNum=id;
学生中心->年龄=年龄;
studentry->pNext=NULL;
学生*pTemp;
pTemp=*头;
如果(*head==NULL){
*人头=学生人数;
}否则{
while(pTemp->pNext!=NULL){
pTemp=pTemp->pNext;
}
pTemp->pNext=学生进入;
}
}
无效争议学生(学生**负责人){
学生*pTemp;
pTemp=*头;
while(pTemp!=NULL){

coutYes,
delete[]
知道如果您将调用
new[]
返回的指针传递给它,那么有多少个元素。在您的代码中,您基本上有:

int * p = new int[3];
// ...
delete [] p;
这正是它设计的目的

这是怎么做的?这不是你的事。就目前的例子来说,在C++的标准标准IATIAI ABI中,没有任何事情可做,你基本上在底层内存上调用了一个“代码>自由”(/CODE)的调用。如果数组元素的类型不是简单的可破坏的,编译器需要将数组元素的数量存储在某个“隐藏”位置(安腾ABI指定的位置),以便调用所有的析构函数。

这可能是或的重复