繁体   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