如何使用智能指针来存储数据



我有两个类。一个类(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);

相关内容

  • 没有找到相关文章

最新更新