[英]C++, vectors, pointers and objects confusion
我正在研究一個項目,作為我的大學系統編程課程的一項功課。 我對指針,矢量,堆棧和堆的問題感到很困惑。
使用C ++。 我必須得到一個對象的矢量作為課程,這些課程對象有幾個不同的領域。 我做的是這樣的:
vector<CoursesObject> coursevector;
然后我創建了我的課程對象類,其中包含課程中剩余的空間和課程字段的名稱。 現在我想添加一個新課程,我這樣做:
CoursesObject *theCourse = new CoursesObject(name, space);
現在我想將它添加到處理程序向量中:
coursevector.push_back(*theCourse);
據我所知,我在堆棧上創建了一個Courses對象的向量,並創建了一個指向堆上的新路徑的新指針,並將指向theCourse的指針添加到堆棧中的指向theTeourse。 我說的是對的嗎?
當我嘗試刪除這些課程對象時,我會這樣做:
for(int i=0; i<coursevector.size(); i++)
delete coursevector.at(i);
這給了我一個錯誤,它不是一個指針。 但是,我沒有向課程對象添加指向課程對象的指針嗎?
請有人解釋一下,我必須正確處理內存,似乎我沒有做對。
這個
vector<CoursesObject> coursevector;
是CourseObjects
的向量,因此它不能保存CourseObject
指針。 當你這樣做:
coursevector.push_back(*theCourse);
你得到的副本CoursesObject
指着由theCourse
存儲在矢量。 您無需從向量中刪除任何條目。 事實上,你不能,因為它沒有指針。
如果你只是避免動態分配,你的程序會簡單得多:
coursevector.push_back(CoursesObject(name, space));
您根本不需要使用新的。
//This vector stores CoursesObject objects,
//not pointers to CoursesObjects.
vector<CoursesObject> coursevector;
//Construct theCourse with automatic storage
//duration.
CoursesObject theCourse(name, space);
//Copy theCourse into coursevector
coursevector.push_back(theCourse);
//theCourse will be automatically destroyed.
//coursevector (and all the objects that it contains)
//will be automatically destroyed.
您的所有對象都沒有動態分配,因此您無法在程序中隨時刪除它們。 請記住,只有在動態分配對象后才能刪除對象:
int Var1 = 0; //cannot be deleted, scope and life will exist for the life of program
int * Var2 = new int; //CAN be deleted, dynamically allocated.
delete Var2; //free memory
但是,您可以刪除最后一個對象,這是一個指針。 我會抓住向量的最后一個元素並在其上調用delete(它應該是你指向類的指針)。
當你這樣做:
coursevector.push_back(*theCourse);
實際上你正在取消引用指針theCourse,所以你要添加一個對象的副本。 您需要聲明CourseObject指針的向量:
vector<CoursesObject *> coursevector;
然后添加一個對象:
coursevector.push_back(theCourse);
現在您刪除對象的代碼應該有效:
for(int i=0; i<coursevector.size(); i++)
delete coursevector.at(i);
coursevector
只能容納CoursesObject
秒且不指針CoursesObject
S,所以你不必使用new
運營商(檢查@ Mankarse的答案)。 但是,如果您仍想保留指針,則將coursevector的定義更改為
vector<CoursesObject*> coursevector;
和push_back指針的值原樣如下:
coursevector.push_back(theCourse);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.