智能指针 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=0x156704080
base1=0x0
base2=0x157804098
use_count()=1
not nullptr

阅读 3.8k
2 个回答

std::shared_ptr<Base*> ,这个是一个指向 Base* 的智能指针,而不是指向 Base 的。它的 get 返回的是 Base **

指向 Base 的智能指针是 std::shared_ptr<Base>


std::make_shared<Base*>(base) ,是以 base 为参数,构造一个新的 Base * 对象,并将这个新对象的地址存入智能指针中。这个新对象的值是 nullptr (就是 base 的值),但是它的地址肯定不是 nullptr 。

因为你返回的是 std::make_shared,肯定不是 nullptr啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题