【问题标题】:C++ Destructor Usage when deleting an object containing a dynamic array as a data member删除包含动态数组作为数据成员的对象时的 C++ 析构函数用法
【发布时间】:2013-12-08 09:31:51
【问题描述】:

我写了两个类:学生和课程。 Course 类在其主体中有一个 Student *students 作为数据成员。在我的顶级 StudentReviewSystem 中,我有一个 Course *courses 作为数据成员,并且我有一个 deleteCourse(const int courseId) 方法,它使用“courseId”删除课程并调整“课程”的大小。这是我的 deleteCourse 方法代码:

void StudentReviewSystem::deleteCourse(const int courseId){
int index = 0;
bool found = false;
//temp arr
Course *temp = new Course[courseSize];
for(int i = 0; i < courseSize && !found; i++){
    if(courseId == courses[i].getCourseId()){
        index = i;
        found = true;
    }
}
if(found){


    temp = courses;

    courses = new Course[courseSize-1];
    for(int i = 0; i <= index-1;i++ ){
        courses[i] = temp[i];
    }
    for(int i = index+1; i < courseSize; i++){
        courses[i-1] = temp[i];
    }


    delete[] temp;

    cout << "Course has been deleted!" << endl;
    courseSize--;
}

}

当我尝试删除 temp 时,我得到一个“检测到 glibc”的错误,它下面有一个内存映射,然后是 aborted(core dumped) 错误。但是当我注释掉 delete[] temp; , 有用。你能帮帮我吗,我真的是 C++ 新手。

谢谢...

P.S:当我注释掉 ~Course(){ delete[] students;} 析构函数时,它再次起作用。我想我有一个非常愚蠢的问题,再次感谢您...

【问题讨论】:

  • 您正在泄漏内存。 Course *temp = new Course[courseSize]; 在这段代码中总是被遗弃和泄露。这不是 Java。从表面上看,您的Course 班级并没有练习Rule of Three 根本
  • std::vector 或其他一些标准容器替换所有这些数组,并使用智能指针和标准算法 - 您可以将该函数减少到大约三行不包含原始新闻或删除的行。你在那里泄露了Course[courseSize]。如果学生可以属于几门课程,我怀疑你是在双重删除他们。

标签: c++ class object pointers memory-leaks


【解决方案1】:

您的错误是您在课程中没有遵循三原则。

详情请参阅here

你应该在你写的每一节课中遵循三分法则。因为您没有遵循三原则,所以任何复制 Course 对象的尝试(就像您在上面尝试做的那样)都会使您的程序崩溃。

我想说理解三法则是成为一名合格的 C++ 程序员的第一步。

【讨论】:

    【解决方案2】:

    你犯了一个典型的错误:你的班级有双重责任。

    解决方法很简单:

    • 一个类来处理动态(可能可调整大小)数组的技术问题
    • 一个类来处理功能需求,使用第一个类来实现其目标

    第一堂课已经开课了(std::vector),如果有必要(又名,你的老师问你)然后你可以重新编码一个std::vector;否则按原样使用它。在std::vector 上阅读更多信息。

    【讨论】:

    • 由于 bug 在 Course 中,因此在此处使用 vector 并没有多大帮助。在课程中使用 vector 也可能是答案。
    【解决方案3】:

    也许你试图删除一个尚未被new分配的数组。

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 2015-01-09
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2015-12-31
      • 2016-01-29
      相关资源
      最近更新 更多