智能指针 get()地址为什么和原生指针地址不同?

作者站长头像
站长
· 阅读数 24

问题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个回答
avatar
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 。

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