【问题标题】:Delete dynamically allocated array c++删除动态分配的数组c ++
【发布时间】:2017-02-24 05:12:03
【问题描述】:
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] 是一个指针数组,我需要移除选中的元素

【问题讨论】:

标签: c++ pointers


【解决方案1】:

第一个问题,如果你真的需要删除“学生”对象。如果是,您可以添加一些错误代码,例如:

students[i] = nullptr;

如果您的学生不仅存储在此数组中,您可以让该存储负责他们的删除。但是这两种方式都不是很好,因为稍后使用空指针。了解如何使用集合,例如 vector。您将能够从数组中删除指针。

【讨论】:

    【解决方案2】:

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

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

    此外,由于您在删除实例后调用析构函数students[i]-&gt;~Student();,它可能会再次崩溃,因为您已分配student[i] = NULL。那么它会是,NULL-&gt;~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; 
    

    【讨论】:

    • 你不能调用析构函数。
    • 而且你不能只删除一个学生。
    • @GoverNator :你为什么不能只删除一个学生? this-&gt;student 似乎是一个指针数组。我希望必须删除每个元素(除了我会将其设为智能指针向量,并让库为我完成繁重的工作)。
    • @Martin Bonner 有点着急。他可以删除一名学生。但是,拥有一个带有空指针的数组并不是很节省。然后他需要转移其他人,这对于数组来说不是一件容易的事。
    • 调用构造函数是错误。删除并将指针设置为 null 可能是正确的答案 - 但如果没有看到声明,我们就无法判断。
    猜你喜欢
    • 2015-06-10
    • 2018-05-01
    • 1970-01-01
    • 2015-08-23
    • 2011-06-07
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多