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

C++ C++;删除包含动态数组作为数据成员的对象时析构函数的用法,c++,class,object,pointers,memory-leaks,C++,Class,Object,Pointers,Memory Leaks,我写了两门课:学生课和课程课。课程类的主体中有一个学生*学生作为数据成员。在我的顶级StudentReviewSystem中,我有一个Course*courses作为数据成员,我有一个deleteCourse(const int courseId)方法,该方法删除带有“courseId并调整大小”courses的课程。以下是我的deleteCourse方法代码: void StudentReviewSystem::deleteCourse(const int courseId){ int ind

我写了两门课:学生课和课程课。课程类的主体中有一个学生*学生作为数据成员。在我的顶级StudentReviewSystem中,我有一个Course*courses作为数据成员,我有一个deleteCourse(const int courseId)方法,该方法删除带有“courseId并调整大小”courses的课程。以下是我的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--;
}
void StudentReviewSystem::deleteCourse(const int courseId){
int指数=0;
bool-found=false;
//临时arr
课程*临时=新课程[课程设置];
对于(int i=0;i对于(int i=0;i可能您试图删除一个尚未由new分配的数组。

您的错误在于您在课程中没有遵循三元规则

有关详细信息,请参阅

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


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

< P>你犯了一个典型的错误:你的班级有双重责任。 解决方案很简单:

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

第一节课已经开始了(
std::vector
),如果有必要(也就是你的老师问你),你可以重新编码一个
std::vector
;否则就照原样使用它。阅读更多内容。

你正在泄漏内存。
Course*temp=new Course[courseSize]
总是在这段代码中被丢弃和泄漏。这不是Java。而且从表面上看,你的
课程
课程根本就没有练习这个。用
std::vector
或其他一些标准容器替换所有这些数组,并使用智能指针和标准算法-你可以将该函数减少到大约三行不包含原始新闻或删除内容。你在那里泄漏了一门
课程[courseSize]
。我怀疑你在双重删除学生,如果他们可以属于多个课程。由于错误正在发生,在这里使用vector不会有多大帮助。在课程中使用vector也可能是答案。