我有一个具有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的原始指针
答案 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));
}