2012-11-03 175 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);