问题1. 为什么将原生指针放到智能指针里后,再通过 get()取出来的地址和原生指针地址不同呢? 比如例子中打印的base0和 base2不同。
问题2. 为什么将 nullptr 放到智能指针里后,通过 get()取出来的地址不是 nullptr 呢? 那如果判断智能指针管理的原生指针是否为 nullptr呢?
class Base {
};
std::shared_ptr<Base*> getBase() {
Base* base = new Base();
printf("base0=%p\n", base);
base = nullptr;
printf("base1=%p\n", base);
return std::make_shared<Base*>(base);
}
int main() {
auto bb = getBase();
printf("base2=%p\n", bb.get());
printf("use_count()=%lu\n", bb.use_count());
if (bb.get() == nullptr) {
printf("nullptr\n");
} else {
printf("not nullptr\n");
}
}
输出:
base0=0x156704080
base1=0x0
base2=0x157804098
use_count()=1
not nullptr
std::shared_ptr<Base*>
,这个是一个指向Base*
的智能指针,而不是指向 Base 的。它的 get 返回的是Base **
。指向
Base
的智能指针是std::shared_ptr<Base>
。std::make_shared<Base*>(base)
,是以 base 为参数,构造一个新的Base *
对象,并将这个新对象的地址存入智能指针中。这个新对象的值是 nullptr (就是 base 的值),但是它的地址肯定不是 nullptr 。