范围指针和重置

Jac*_*opo 4 c++ boost scoped-ptr

我正在玩增强范围指针,我不明白这种行为:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

0x7fff5fbff650
0x7fff5fbff650
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ica 7

当你这样做

std::cout << &p << '\n';
Run Code Online (Sandbox Code Playgroud)

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

std::cout << static_cast<void*>(p.get()) << '\n';
Run Code Online (Sandbox Code Playgroud)

static_cast<void*>()是不是真的需要在本例中为打印指针,比其它char*/ const char*会给你的地址,但我说这只是是安全的.


Lig*_*ica 5

你拿的是scoped_ptr被叫的地址p.只有其中一个!

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

此地址将始终更改,因为您在new销毁第一个对象之前稍微创建了第二个对象(使用),并且对象无法共享地址.

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