2012-11-03 210 views
4

我正在做一個項目,作爲我的大學系統編程課程的作業。 我對指針,向量,堆棧和堆的事情感到困惑。C++,向量,指針和對象混淆

使用C++。 我必須得到一個課程的對象矢量,這些課程對象有幾個不同的領域。 我所做的就是這樣的:

vector<CoursesObject> coursevector; 

,然後我創造了我的課程對象類,它包含留在課程和課程領域的名稱空間。 現在我想添加一個新的過程中,我做的:

CoursesObject *theCourse = new CoursesObject(name, space); 

現在我想將它添加到處理程序向量:

coursevector.push_back(*theCourse); 

與所有我知道,我創建課程對象的矢量並在堆上創建了一個指向新課程的新指針,並將該指針添加到處理程序向量中指向堆中的課程對象的指針theCourse。我說的是正確的嗎?

當我嘗試刪除這些課程的對象,我做的:

for(int i=0; i<coursevector.size(); i++) 
    delete coursevector.at(i); 

這給了我一個錯誤,這是不是一個指針。但是,我還沒有在課程向量中添加指向課程對象的指針嗎?

請有人解釋,我必須正確處理內存,似乎我沒有得到正確的。

+0

您可以使用矢量<* CoursesObject>和使用它存儲指針而不是對象。 – Jimm

回答

4

你根本不需要使用新的。

//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. 
5

vector<CoursesObject> coursevector; 

CourseObjects一個矢量,所以它不能持有CourseObject指針。當你這樣做:

coursevector.push_back(*theCourse); 

你得到CoursesObject的副本在由存儲在矢量theCourse指出。您不需要從矢量中刪除任何條目。事實上,你不能,因爲它不掌握指針。

你的程序就會簡單得多,如果你只是避免了動態分配:

你的對象的
coursevector.push_back(CoursesObject(name, space)); 
+0

所以對象ITSELF(而不是它的指針)被存儲在處理程序向量中? 而且,這樣,我只需要刪除指令theCourse,對吧? – TheNotMe

+0

@ user1656647對象本身的**副本**被存儲。所以是的,你只需要刪除原文,但我認爲沒有理由首先動態分配它。 – juanchopanza

+0

太棒了。那麼這隻會讓我想起如何從堆中刪除課程對象本身的問題? – TheNotMe

0

都沒有動態分配的,所以你不能在程序中的任何時間將其刪除。請記住,你只能刪除對象一旦被動態分配:

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(它應該是你指向類的指針)。

+0

所以,課程對象的名稱和空間,它坐在哪裏?在堆或堆棧中?因爲我做了新的CoursesObject(名稱,空間)... – TheNotMe

+0

我不太以下,但簡單地改變你的courseobject到courseobject *將允許你刪除變量,考慮到你在的地方添加指向矢量只是正常的反對這次。 –

+0

太好了,謝謝! – TheNotMe

0

,當你這樣做:

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); 
+1

注意原始指針的向量是*不*一個很好的解決方案。 –

0

coursevector可以容納只有CoursesObject s,而不是指向CoursesObject s,所以你不需要使用new運算符(check @ Mankarse的回答)。但是,如果你仍然想持有指針,然後coursevector的定義修改爲

vector<CoursesObject*> coursevector; 

和的push_back指針的值,因爲它是:

coursevector.push_back(theCourse);