删除动态分配的数组c ++

时间:2017-02-24 05:12:04

标签: c++ pointers

bool StudentList::remove(const char * studentName)
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        if (this->students[i]->isEqualTo(studentName)) // Finds a name to remove
        {
            cout << "Remove: "; // Displays name wished to be removed
            students[i]->print();
            // delete[] students[i]; - Crashes 
            // students[i] = NULL; - Replaces removed name with null, stops working.  
            // students[i]->~Student(); - Call deconstructor, Crashes.
            return true;
        }
    }
    return false;
}

我只是想从数组中删除一个元素,但在删除该元素时会一直崩溃。

students [i]是指针数组,我需要删除所选元素

2 个答案:

答案 0 :(得分:0)

如果您能找到学生名,似乎要删除每个学生实例。

students似乎是指向指针的二维结构指针。即; **students。但是,您要以错误的方式删除它。首先需要删除students[i]的实例,然后删除学生实例。

此外,由于您在删除实例后调用析构函数students[i]->~Student();,因此您可能会再次崩溃,因为您已分配student[i] = NULL。然后它会,NULL->~Student() - 也会导致崩溃。

您需要按以下方式删除它:

for (int i = 0; i < MAX_SIZE; i++)
{
    if (this->students[i]->isEqualTo(studentName)) // Finds a name to remove
    {
        students[i]->~Student();

        delete students[i];

        students[i] = NULL; 
    }
 }
 delete[] students;

 students = NULL; 

答案 1 :(得分:0)

首先排队,如果你真的需要删除&#34;学生&#34;宾语。如果是,您可以添加一些不良代码,如:

students[i] = nullptr;

如果您的学生不仅存储在此阵列中,您可以让该存储负责删除。但是由于之后使用空指针,这两种方式都不是很好。了解如何使用集合,例如vector。您只需从数组中删除指针即可。