4

我正在玩提升范围的指针,但我不明白这种行为:

#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

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

4

3 回答 3

7

当你这样做

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

您得到的是 的地址p,而不是p指向的地址。为了得到你需要的

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

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

于 2018-11-29T15:51:03.437 回答
5

您正在获取scoped_ptr被叫的地址p。只有其中一个!

如果您打印了&*porp.get()代替(虽然更喜欢(void*)p.get()理智),那么您将打印它当前指向的东西的地址。

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

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

于 2018-11-29T15:51:14.037 回答
0

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

于 2018-11-29T15:54:00.787 回答