#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
。
如果我在这里错了,请纠正我。
答案 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);
}