如何过早地破坏智能指针

时间:2015-07-23 13:42:00

标签: c++ c++11 setter unique-ptr

我有一个具有setter方法的类,该方法将unique_ptr作为参数。该unique_ptr保存为类成员。

class TestClass {
    std::unique_ptr<Tester> sp;

    void setTester_Way1(std::unique_ptr<Tester> te) {
         auto deleter=std::move(sp);
         sp=std::move(te);
    }

    void setTester_Way2(std::unique_ptr<Tester> te) {
         sp=std::move(te);
    }
};

设置智能指针的正确方法是哪种? Way2是否泄漏sp的原始指针

2 个答案:

答案 0 :(得分:5)

Way2没问题,当您分配给unique_ptr时,任何现有拥有的指针都将被安全删除。

答案 1 :(得分:1)

正如Chris Drew所说,Way2很好。但有一点是unique_ptr不可复制/可分配,因此传递unique_ptr的唯一方法是引用,r值引用或带move()的值。试着做:

int main()
{
    TestClass t;
    auto p = std::make_unique<int>(10);
    t.setTester_Way2(p);
}

Will fail to compile。虽然您可以move() p加入函数(example)。

如果您将setTester_Way2()更改为void setTester_Way2(std::unique_ptr<int>& te) then it will compile。如果您更改函数以获取右值引用并将指针std::move()转换为函数:

class TestClass {
    std::unique_ptr<int> sp;
public:

    void setTester_Way1(std::unique_ptr<int> te) {
         auto deleter=std::move(sp);
         sp=std::move(te);
    }

    void setTester_Way2(std::unique_ptr<int>&& te) {
         sp=std::move(te);
    }
};

int main()
{
    TestClass t;
    auto p = std::make_unique<int>(10);
    t.setTester_Way2(std::move(p));
}

Then it will also compile