std::unique_ptr 的 get() 可以用来获取指针指向位置的实际地址,但是如果在 reset() 之前被暂存起来了,那么 reset() 之后便不会影响存起来的那个值,如果认为 reset() 会影响之前暂存的值,则会导致dangling pointer 访问,从而触发段错误,demo如下:

#include <string>
#include <iostream>
#include <memory>

int main(int agrc,char** agrv)
{
int * r_p_i;
std::unique_ptr<int> p_i = std::make_unique<int>(1);
r_p_i = p_i.get();

printf("r_p_i -> %p\n",r_p_i);

if(r_p_i == NULL){
std::cout << "1 . r_p_i == NULL" << std::endl;
}

p_i.release();

printf("p_i -> %p\n",p_i.get());
printf("r_p_i -> %p\n",r_p_i);

if(p_i.get() == NULL){
std::cout << "1 . p_i == NULL" << std::endl;
}else{
std::cout << "1 . p_i != NULL" << std::endl;
printf("p_i -> %p\n",p_i.get());
}

if(r_p_i == NULL){
std::cout << "2 . r_p_i == NULL" << std::endl;
}else{
std::cout << "2 . r_p_i != NULL" << std::endl;
printf("r_p_i -> %p\n",r_p_i);
}

}

尽量使用 shared_ptr ,如果确定要使用 unique_ptr , 那么一定要保证多线程场景下 get() 在使用时进行了 ptr 的转移,否则极可能误操作导致崩溃。