我有一个家庭作业问题,其中我有class Student
,以及指向Student
个对象的指针向量,它是Student类中的成员字段:
vector<Student*> vectorName;
为了做正确的(?)内存管理,我在Student类中声明了这样的析构函数
Student::~Student() {
for(int i=0; i<vectorName.size(); i++){
delete vectorName.at(i);
}
}
真的是否正确地从堆中释放内存,还是有更好的方法?
答案 0 :(得分:5)
这主要取决于存储Student*
个引用的位置。如果Student*
实例的个人学生列表中没有任何其他地方的参考,那么您正在做的事情会产生许多悬空指针。
当销毁std::vector
包含的对象上的析构函数被隐式调用时,这意味着如果包含的对象是Student*
,那么只释放指针的空间,你必须手动执行你的操作正在做的是正确的如果你没有将同一个学生*存放在多个馆藏中,那就是
总结一下:
Student*
对象。Student*
将导致其他集合中指向它的指针无效,这将导致问题答案 1 :(得分:2)
如果您使用vectorname
分配了new Student
项,那么是。但是你必须记住,在这一点之后,vectorName.at(i)
所指向的任何数据都会被销毁,并且不应该在程序的其他地方访问。
答案 2 :(得分:2)
如果向量拥有学生(也就是说,它负责删除它们),根本不要使用指针(除非你需要多态性,但你没有在问题中说明,所以我假设你不要T)。如果这样做,则不需要再显式定义dtor,copy ctor和copy assignment操作符;请参阅Rule of Zero。
vector<Student> vectorName;
如果您不希望在向量中插入对象时复制对象的开销,请移动它们或使用emplace_back
:
vectorName.push_back(std::move(student));
vectorName.emplace_back("John", 42);