我有两个类。一个类(Person)有一个由另一个类(Student)的指针组成的向量集合。在运行时,Person类将调用一个方法,该方法将在vector中存储一个指向Student类的指针。我一直试图用智能指针来避免可能出现的内存泄漏问题,但我正在努力这样做。我该怎么做呢?
我的目标是让Person类拥有对存在于代码中其他地方的对象的句柄
Class Student
{
public:
string studentName
Student(string name){
studentName = name;
}
}
Class Person
{
public:
vector <Student*> collection;
getStudent()
{
cout << "input student name";
collection.push_back(new Student(name));
}
}
这里不需要使用智能指针。将对象直接放入vector中,它们的生存期由vector管理:
std::vector<Student> collection;
collection.emplace_back(name);
在另一个答案的基础上,您应该按值存储Student。
从简单的角度来看,有三种方法可以在vector中存储内容:std::vector<std::shared_ptr<Student>> students;
// an array of smart pointers
std::vector<Student*> students; // array of pointers
std::vector<Student> students; // array of objects stored by value.
差异归结为一系列事情:所有权,生命周期,是存储在堆中还是堆栈中。
在这种情况下,您可能希望按值存储学生,因为我们可以安全地说'Person'类'拥有'学生列表。当成员变量按值存储时,只要它所在的作用域存在,它就会存在。在这种情况下,学生向量只有在它的父对象(Person的实例化)存在时才会存在。
如果你真的想用智能指针存储东西,你可以这样做:
std::shared_ptr<Student> myStudent = std::make_shared<Student>(name);
students.push_back(myStudent);