[英]Writing a destructor for a class containing a dynamically allocated array member 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.