当前位置: 首页 > 知识库问答 >
问题:

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

姚飞昂
2023-05-13

问题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

共有2个答案

刘凡
2023-05-13

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

颛孙博易
2023-05-13

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

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


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

 类似资料:
  • 问题内容: 在Go 规范中写道: 字符串是不可变的:一旦创建,就无法更改字符串的内容。 我有以下代码: 我原本希望地址在之后更改。就像Java那样,我们在其中重新分配String引用。 什么是“不变性”? 问题答案: 值 是不可变的。 不是一个值。这是一个 变量 (类型)。并且变量的值可能会更改,这就是您对任何编程语言所期望的。 是一个值,这是不可变的。是另一个值,当您分配给时,您只需为变量分配另

  • 本文向大家介绍指针与地址的区别? 相关面试题,主要包含被问及指针与地址的区别? 时的应答技巧和注意事项,需要的朋友参考一下 区别: 1指针意味着已经有一个指针变量存在,他的值是一个地址,指针变量本身也存放在一个长度为四个字节的地址当中,而地址概念本身并不代表有任何变量存在. 2 指针的值,如果没有限制,通常是可以变化的,也可以指向另外一个地址. 地址表示内存空间的一个位置点,他是用来赋给指针的,地

  • ///01.地址.c #include <stdio.h> #include <stdlib.h> int get() { return 10; } //01.严格进行变量区分: // 1.普通变量和指针变量 // 2.严格的变量类型: // 常规类型+特殊类型 //02.对变量取地址的操作发起于寄存器当中 // 因此地址也生成于寄存器变量当中,C语言无法直接访问 //

  • C++ 指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。C++ 指针

  • 我试图理解地址计算指令是如何工作的,尤其是使用< code>leaq命令。然后,当我看到使用< code>leaq进行算术计算的例子时,我会感到困惑。例如,下面的C代码, 在组装中, 如果我的理解是对的,leaq应该移动任何地址,应该是,评估为。我感到困惑的是,既然值x存储在中,这只是内存地址,为什么乘以%rdi 3然后左移这个内存地址2等于x乘以12?当我们乘以3时,我们不是跳转到另一个不保存值

  • 指针 (pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用(reference)。引用以 符号为标志并借用了他们所指向的值。除了引用数据它们没有任何其他特殊功能。它们也没有任何额外开销,所以应用的最多。 另一方面,智能指针(smart pointers)是一类数据结构,他们的表现类似指针,但