4

我正在做一个项目,作为我大学系统编程课程的家庭作业。我对指针、向量、堆栈和堆的问题感到非常困惑。

使用 C++。我必须得到一个对象向量,这些对象是课程,这些课程对象有几个不同的字段。我所做的是这样的:

vector<CoursesObject> coursevector;

然后我创建了我的课程对象类,其中包含课程中剩余的空间和课程字段的名称。现在我想添加一门新课程,我这样做:

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

现在我想将它添加到处理程序向量中:

coursevector.push_back(*theCourse);

据我所知,我在堆栈上创建了 Courses 对象的向量,并为堆上的新课程创建了一个新指针,并将指向堆中课程对象的指针 theCourse 添加到处理程序向量中。我说的对吗?

当我尝试删除这些课程对象时,我会:

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

这给了我一个错误,它不是指针。但是我不是在 coursevector 中添加了指向 course 对象的 POINTER 吗?

请有人解释一下,我必须正确处理内存,但似乎我做得不对。

4

5 回答 5

5

vector<CoursesObject> coursevector;

是 的向量CourseObjects,因此它不能保存CourseObject指针。当你这样做时:

coursevector.push_back(*theCourse);

您将获得存储在向量中的CoursesObject指向的副本。theCourse您不需要从向量中删除任何条目。事实上,你不能,因为它不保存指针。

如果您只是避免动态分配,您的程序会简单得多:

coursevector.push_back(CoursesObject(name, space));
于 2012-11-03T15:15:12.087 回答
4

您根本不需要使用 new 。

//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.
于 2012-11-03T15:19:59.540 回答
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(这应该是指向类的指针)。

于 2012-11-03T15:18:19.730 回答
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);
于 2012-11-03T15:25:06.577 回答
0

coursevector只能保存CoursesObjects 而不是指向CoursesObjects 的指针,因此您无需使用new运算符(查看@Mankarse 的答案)。但是,如果你仍然想持有指针,那么将 coursevector 的定义更改为

vector<CoursesObject*> coursevector;

并 push_back 指针的值原样:

coursevector.push_back(theCourse);
于 2012-11-03T15:25:41.720 回答