簡體   English   中英

刪除包含動態數組作為數據成員的對象時的C ++析構函數用法

[英]C++ Destructor Usage when deleting an object containing a dynamic array as a data member

我寫了兩節課:學生和課程。 課程類在其主體中有一個學生*學生作為數據成員。 在我的頂級StudentReviewSystem中,我有一個Course *課程作為數據成員,並且我有一個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--;
}

}

當我嘗試刪除temp時,出現“ glibc檢測到”錯誤,並在其下有一個內存映射,然后出現異常終止(核心轉儲)錯誤。 但是當我注釋掉delete [] temp行時; , 有用。 您能幫我嗎,我真的是C ++的新手。

謝謝...

PS:當我注釋掉〜Course(){delete [] students;}析構函數時,它再次起作用。 我認為我有一個非常愚蠢的問題,再次感謝您...

您犯了一個典型的錯誤:您的課程有雙重責任。

解決方案很簡單:

  • 一類處理動態(可能可調整大小)數組的技術問題
  • 一個類來處理功能需求,使用第一類來實現其目標

第一類已經可用( std::vector ),如果有必要(又名,老師問您),那么您可以重新編碼std::vector 否則按原樣使用。 了解更多關於std::vector

您的錯誤是您在課程課程中未遵循三個規則。

詳細信息請參見此處

在編寫的每個類中,您都應遵循三個規則。 因為您沒有遵循3的規則,所以任何復制Course對象的嘗試(如您在上面所做的嘗試)都會使程序崩潰。

我要說的是,理解三個規則是成為一名體面的C ++程序員的第一步。

也許您嘗試刪除尚未由new分配的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM