在为其分配新值之前,应该将`nullptr`分配给`std :: unique_ptr`?

时间:2016-06-16 19:43:21

标签: c++

#include <iostream>
#include <memory>
using namespace std;

int main() {
    std::unique_ptr<int> ptrA = std::make_unique<int>(10);

    ptrA = std::make_unique<int>(20); // case I

    return 0;
}


#include <iostream>
#include <memory>
using namespace std;

int main() {
    std::unique_ptr<int> ptrA = std::make_unique<int>(10);

    ptrA = nullptr;                  // case II or ptrA.reset()
    ptrA = std::make_unique<int>(20);

    return 0;
}

我见过很多人使用Case II。但是,std::unique_ptr是智能指针,我认为在重新分配新值之前,我们不应指定nullptr或致电reset

如果我在这里错了,请纠正我。

3 个答案:

答案 0 :(得分:7)

在分配新值之前分配nullptr是没有意义的。

答案 1 :(得分:4)

首先分配给nullptr是一种超级有误导性的做法:

ptrA = std::make_unique<int>(20);

就足够了,因为unique_ptr::operator=在分配之前会释放其拥有的内存,然后再获取新内存。

答案 2 :(得分:2)

我认为调用reset或赋值nullptr是没有意义的,但事实证明这会导致汇编程序中的占用空间更小。 https://godbolt.org/上的编译器资源管理器,使用gcc 7.2,使用-O3代码:

void test1()
{
    auto test1 = std::make_unique<int>(5);
    test1 = std::make_unique<int>(6);
}

令人惊讶地导致比uglier版本更多的指令:

void test2()
{
    auto test1 = std::make_unique<int>(5);
    test1 = nullptr;
    test1 = std::make_unique<int>(6);
}