【问题标题】:C++ smart pointers addressC++ 智能指针地址
【发布时间】:2013-05-24 04:35:12
【问题描述】:

我对智能指针有点困惑。在下面的代码中,&运算符应该返回智能指针分配的地址还是它所控制的指针的地址?

main() {
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1));
    std::shared_ptr<int> j = i;
    printf("(%p, %p)\n", &i, &j);
}

运行代码,我得到了不同的地址。如果我使用原始指针运行等效代码,我会得到相同的地址:

main() {
    int e = 1;
    int *k = &e;
    int *l = k;

    printf("(%p, %p)\n",k,l);
}

【问题讨论】:

  • 使用 i.get() 和 j.get() 而不是 &i 和 &j 来获取智能指针持有的指针。
  • 是的,现在我明白了。谢谢你。想要发布答案?
  • @Laserallan:这就是答案……你能把它作为答案发布吗?

标签: c++ pointers smart-pointers


【解决方案1】:

在第一个示例中,您将获取智能指针对象的地址。智能指针中包含的原始指针是通过get() 函数提供的。

实际上,智能指针的地址获取与常规指针几乎完全相同。您的第一个示例的原始指针等效项是这样的:

main() {
    int e = 1;
    int *k = &e;
    int *l = k;

    printf("(%p, %p)\n",&k,&l); // now they're different!
}

你的第二个例子的智能指针是这样的:

main() {
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1));
    std::shared_ptr<int> j = i;
    printf("(%p, %p)\n", i.get(), j.get()); // now they're the same!
}

【讨论】:

  • 感谢您的回答。但是,共享指针中的 -> 是否重载?因为我可以做,例如 i->someMethod() 而没有 (i.get())->someMethod()...
  • 谢谢,现在一切都说得通了。
【解决方案2】:

请调用std::shared_ptr的.get()成员函数获取你想要的地址。

【讨论】:

    【解决方案3】:

    这里的主要技巧是共享指针的相等运算符 (=) 的定义方式是:

    std::shared_ptr<int> j = i;
    

    j 不会是 i 的完整副本。但它只会保留我持有的共享指针相同的原始指针,因此它们的地址会不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多