【问题标题】:scoped pointers and reset范围指针和重置
【发布时间】:2018-11-29 15:48:57
【问题描述】:

我在玩 boost 作用域指针,但我不明白这种行为:

#include <iostream>
#include <boost/scoped_ptr.hpp>

int main()
{

    boost::scoped_ptr<int> p{new int{1}};
    std::cout << &p << '\n';
    p.reset(new int {2});
    std::cout << &p << '\n';

    return 0;
}

我得到以下输出:

0x7fff5fbff650
0x7fff5fbff650

reset函数不应该改变p指向的地址吗? 如果使用范围数组而不是范围指针并打印上面代码中第一个元素指向的地址,就会出现这种情况。

【问题讨论】:

  • 谢谢,刚刚试过 p.get() 确实得到了不同的地址。
  • 远程相关:请注意operator&amp; 可能会被重载以返回您所期望的(不是),对于这种情况,std::adressof

标签: c++ boost scoped-ptr


【解决方案1】:

当你这样做时

std::cout << &p << '\n';

您得到的是p 的地址,而不是p 指向的地址。要做到这一点,你需要

std::cout << static_cast<void*>(p.get()) << '\n';

static_cast&lt;void*&gt;() 在这个例子中并不是真正需要的,因为打印一个指针,除了 char*/const char* 会给你它的地址,但我添加它只是为了安全。

【讨论】:

  • void* 在这个例子中是不必要的。只有在处理char*指针时才需要。
  • @RemyLebeau 我已经在答案中指出了这一点。
【解决方案2】:

您正在获取名为pscoped_ptr 的地址。只有一个!

如果您改为打印&amp;*pp.get()(尽管为了理智更喜欢(void*)p.get()),那么您将打印它当前指向的东西的地址。 p>

此地址将始终更改,因为您在第一个对象被销毁之前创建了第二个对象(使用new),并且对象不能共享地址。

但是,如果您先完成了.reset(),那么您可能会或可能不会看到此地址发生变化,这取决于new 的内部结构;对象没有必须在程序的生命周期内拥有唯一的地址,只要它们不共享另一个仍然存在的对象的地址!然而,即便如此,在实践中,老实说,如果第二个动态分配的 int 与第一个在同一个地址结束,我会感到惊讶。

【讨论】:

    【解决方案3】:

    您正在使用 boost::scoped_ptr 打印对象 p 的地址。 您应该使用 p.get() 来获取句柄对象的地址;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2011-07-22
      • 2016-11-15
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      相关资源
      最近更新 更多