C++ 作用域指针和重置
我在玩boost作用域指针,我不理解这种行为: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 << &
#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';