【问题标题】:STL Vector of Unique_ptr - How to reset?Unique_ptr 的 STL 向量 - 如何重置?
【发布时间】:2012-11-19 02:23:31
【问题描述】:

我创建了两个unique_ptr的标准向量:

std::vector<std::unique_ptr<Student>> students;
std::vector<std::unique_ptr<Teacher>> teachers;

然后,我创建一个新对象并将其放入向量中:

students.push_back(std::unique_ptr<Student> (new Student()));
teachers.push_back(std::unique_ptr<Teacher> (new Teacher()));

完成所有操作后,如何删除向量?

除了 unique_ptr 我必须做一个循环并删除每个对象:

while (!students.empty())
{
    delete students.back();
    students.pop_back();
}

现在有了 unique_ptr 我该怎么办?

我知道我必须使用 unique_ptr::reset(我认为)。

【问题讨论】:

    标签: c++ vector c++11 std unique-ptr


    【解决方案1】:

    很简单:

    students.clear();
    

    这就是智能指针(如unique_ptr)的用途——它们负责在适当的时候销毁指向的对象。

    【讨论】:

    • 所以基本上,当我调用 clear() 时,所有对象都被删除了?
    • @user1860848 是的,完全正确。当您调用clear() 时,将删除向量中的对象(unique_ptrs)。当 unique_ptr 被删除时,它会删除它指向的对象。
    • 写法正确:std::vector<:unique_ptr>> students; ?只是好奇。
    • @user1860848 是的,但这意味着完全不同的东西。它是指向Students 的动态分配 原始指针的唯一指针向量。在这种情况下,当唯一指针被销毁时,指向的原始指针将被释放,但Student 实例不会受到影响(如果它是动态分配的,它可能会被泄露)。
    • @Angew 为什么std::vector&lt;std::unique_ptr&lt;Object&gt;&gt; 可以工作,而std::vector&lt;Object*&gt; 却不行?我相信在unique_ptr 的情况下,“删除”是“执行”编译时,而在原始指针的情况下,它必须动态完成。但是,使 C++“知道”向量元素的期望生命周期的具体机制是什么……这使得 vector.clear() 调用非指针类型的析构函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多