簡體   English   中英

C ++,向量,指針和對象混淆

[英]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.

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