我正在开展一个项目,作为我的大学系统编程课程的一项功课。 我对指针,矢量,堆栈和堆的问题感到很困惑。
使用C ++。 我必须得到一个对象的矢量作为课程,这些课程对象有几个不同的领域。 我做的是这个:
vector<CoursesObject> coursevector;
然后我创建了我的Courses Object类,其中包含课程中剩余的空间和课程字段的名称。 现在我想添加一个新课程,我做:
CoursesObject *theCourse = new CoursesObject(name, space);
现在我想将它添加到处理程序向量中:
coursevector.push_back(*theCourse);
据我所知,我在堆栈上创建了一个Courses对象的向量,并创建了一个指向堆上新路线的新指针,并将指向theCourse的指针添加到了处理程序向量中堆。我说的是对的吗?
当我尝试删除这些课程对象时,我会这样做:
for(int i=0; i<coursevector.size(); i++)
delete coursevector.at(i);
这给了我一个错误,它不是一个指针。但是我没有在课程对象中添加一个POINTER到课程对象吗?
请有人解释一下,我必须正确处理内存,而且似乎我说得不对。
答案 0 :(得分:5)
此
vector<CoursesObject> coursevector;
是CourseObjects
的向量,因此无法保存CourseObject
个指针。当你这样做时:
coursevector.push_back(*theCourse);
您会获得存储在向量中的CoursesObject
所指向的theCourse
的副本。您无需从向量中删除任何条目。事实上,你不能,因为它没有指针。
如果您只是避免动态分配,那么您的程序会更简单:
coursevector.push_back(CoursesObject(name, space));
答案 1 :(得分: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.
答案 2 :(得分: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(它应该是你指向类的指针)。
答案 3 :(得分: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);
答案 4 :(得分:0)
coursevector
只能保留CoursesObject
s而不是指向CoursesObject
的指针,因此您无需使用new
运算符(请查看@ Mankarse的回答)。但是,如果您仍想保留指针,则将coursevector的定义更改为
vector<CoursesObject*> coursevector;
并按原样push_back指针的值:
coursevector.push_back(theCourse);