C ++析构函数删除包含动态数组作为数据成员的对象时的用法

时间:2013-11-23 13:27:14

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

我写过两个课程:学生和课程。课程班有一名学生*学生作为其正文中的数据成员。在我的顶级StudentReviewSystem中,我有一个Course *课程作为数据成员,我有一个deleteCourse(const int courseId)方法,用“courseId和resizes”课程删除课程。这是我的deleteCourse方法代码:< / p>

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 detected”错误,其下有一个内存映射,然后是当时中止(核心转储)错误。但当我注释掉行删除[] temp; , 有用。你能帮助我吗,我是C ++的新手。

谢谢...

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

3 个答案:

答案 0 :(得分:2)

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

解决方案很简单:

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

第一堂课已经可用(std::vector),如果有必要(也就是说,老师问你),那么你可以重新编码std::vector;否则按原样使用。详细了解std::vector

答案 1 :(得分:1)

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

有关详细信息,请参阅here

你应该在你写的每个班级都遵守三条规则。因为您没有遵循三条规则,所以任何复制Course对象的尝试(就像您上面尝试的那样)都会使您的程序崩溃。

我会说理解三的规则是成为一名体面的C ++程序员的第一步。

答案 2 :(得分:0)

也许您尝试删除尚未由new分配的数组。