智能指针 get()地址为什么和原生指针地址不同?
问题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=0x156704080base1=0x0base2=0x157804098use_count()=1not nullptr
回复
1个回答

test
2024-07-03
std::shared_ptr<Base*>
,这个是一个指向 Base*
的智能指针,而不是指向 Base 的。它的 get 返回的是 Base **
。
指向 Base
的智能指针是 std::shared_ptr<Base>
。
std::make_shared<Base*>(base)
,是以 base 为参数,构造一个新的 Base *
对象,并将这个新对象的地址存入智能指针中。这个新对象的值是 nullptr (就是 base 的值),但是它的地址肯定不是 nullptr 。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容