c++ - 如何清除为 C++ 中的指针正确指向的数组分配的内存?

标签 c++ memory-management linked-list free

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

我对我的删除功能有疑问。是否删除[] pTemp->top3Grades;实际上删除/释放所有数组项?它知道在 3 个元素后停止吗?如何?如果内存中的某些数据可能与前 3 个数据相同(或相同类型的数据)怎么办? 3 是否被 secret 传递给删除函数以便它知道何时停止?还是只删除第一个元素 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;
}

最佳答案

是的,delete[] 知道有多少元素,如果您向它传递一个从调用 new[] 返回的指针。在您的代码中,您基本上:

int * p = new int[3];
// ...
delete [] p;

这正是它的设计目的。

它是如何做到的?那不关你的事。对于当前的示例,在用于 C++ 的准标准 Itanium ABI 中,无需执行任何操作,您实际上最终会在底层内存上调用 free()。 (因此,只需使用您对 free() 的现有理解来填补空白。)如果数组元素的类型不是平凡可破坏的,则编译器需要将数组元素的数量存储在一些“隐藏”的地方(Itanium ABI 指定)以便它可以调用所有的析构函数。

关于c++ - 如何清除为 C++ 中的指针正确指向的数组分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328189/

相关文章:

c++ - 使用STL在列表<>中查找最小值

c++ - 有没有办法优化 g++ 以使其构建速度更快?

c++ - 合并列表

c - 链表问题

java - 如何为 LinkedList<LinkedList<obj>> 实现可迭代

c++ - VS2015 + VTK 7.1.0 + Qt 5.8.0 运行来自 VTK 入口点失败的 Qt 示例

c++ - STL容器迭代器和C指针迭代器有什么区别

c++ - 在 Windows 中禁用 LFH?

ios - 这段代码的内存管理问题是什么?

objective-c - 为什么 Xcode 说它可能会泄漏?