Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作用域指针和重置_C++_Boost_Scoped Ptr - Fatal编程技术网

C++ 作用域指针和重置

C++ 作用域指针和重置,c++,boost,scoped-ptr,C++,Boost,Scoped Ptr,我在玩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 << &

我在玩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;
}
重置功能是否应该更改p所指的地址? 如果使用作用域数组而不是作用域指针,并打印上面代码中第一个元素所指的地址,则会出现这种情况。

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


在本例中,
static\u cast()
并不是真正需要的,因为除了
char*
/
const char*
之外,打印一个指针将为您提供其地址,但我添加它只是为了安全。

您使用的是名为
p
作用域ptr
的地址。只有一个

如果您打印的是
&*p
p.get()
(尽管出于理智,您更喜欢
(void*)p.get()
),那么您将打印它当前指向的对象的地址

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


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

您正在打印的对象p的地址是boost::scoped\u ptr。
应该使用p.get()获取句柄对象的地址

谢谢,刚刚尝试了p.get(),确实得到了不同的地址。远程相关:请注意,
操作符&
可能会被重载以返回您期望的内容(它不是),在这种情况下,
std::adressof
在本例中,
void*
强制转换是不必要的。只有在处理
char*
指针时才需要它。@RemyLebeau我在回答中注意到了这一点。
std::cout << &p << '\n';
std::cout << static_cast<void*>(p.get()) << '\n';