C++ 获取引用指向的对象的地址

C++ 获取引用指向的对象的地址,c++,C++,在将对象传递给函数之前,我希望强制对象应该存在: void Class::setStoredObject(MustExist& obj) { stored_object = &obj; } // Lifetime of ptr is my responsibility std::unique_ptr<MustExist> ptr = std::make_unique<MustExist>(); classObject.setStoredObject(

在将对象传递给函数之前,我希望强制对象应该存在:

void Class::setStoredObject(MustExist& obj) {
  stored_object = &obj;
}

// Lifetime of ptr is my responsibility
std::unique_ptr<MustExist> ptr = std::make_unique<MustExist>();
classObject.setStoredObject(*ptr);
void类::设置存储对象(MustExist&obj){
存储的对象=&obj;
}
//ptr的生命是我的责任
std::unique_ptr ptr=std::make_unique();
classObject.setStoredObject(*ptr);
无论如何,我还需要通过引用或地址存储该对象(大对象),所以我通常会获取指向它的指针

这样做安全吗?即,获取引用的地址以引用原始指向对象


或者,有没有其他/更好的方法可以实现这一点?

这本身并没有什么问题。当然,如果原始对象超出范围并被销毁,则保存的指向该对象的指针将不再有效。

最安全的方法是实例化并传递一个共享的ptr,以确保获得一个现有对象,并且在无法检查的情况下不会将其删除。通过这种方式,您可以选择存储共享的\u ptr,以确保它不会消失(但随后需要一些清理代码),或者存储为弱\u ptr,以便仅在它仍然存在时使用它


存储由智能指针控制的对象的原始指针可能会导致非常微妙的问题,很难追溯到代码。

通常,从std::unique_ptr中获取并使用原始指针不是一个好的设计,因为它打破了所有的想法。

取消引用
ptr
并通过引用传递对象对于您尝试执行的操作不是一个好的语义

如果调用方上下文需要
唯一\u ptr
,则应使用:

void Class::setStoredObject(std::unique_ptr<MustExist> obj_ptr)
表示调用上下文正在放弃所有权这一事实

否则,您可以完全放弃惟一的_ptr(在您的示例中,它的存在是不合理的)。在这种情况下,我会考虑以下任何一个:

void Class::setStoredObject(const MustExist& obj) // ok for copy
void Class::setStoredObject(MustExist&& obj) // move semantics, expressing the fact that the caller is done using the object.

显然,对象的生存期必须超过指针的任何解引用的生存期。我使用相同的方法。指针和引用是相似的,重要的区别是:指针可以是未初始化的,也可以是空的,可以是递增的,引用not@KerrekSB是的,这是我的责任,所以我得到的是原始对象的地址,而不是“函数的堆栈参数引用”对吗?@Dean您得到的是作为函数参数提供的任何对象的地址。如果发布调用函数的实际代码,则clearer@M.M编辑。谢谢。@Dean:也许你的不确定性来自于:表达式是以值而不是变量的形式工作的。值永远不是引用。您获取的是值的地址,而不是变量的地址。计算引用变量名称所得的值是绑定到引用的值。确定,在更新的代码
中,存储的\u ptr
将指向调用时由
唯一\u ptr
管理的对象。在将
存储的\u ptr
更改为不再指向该对象之前,必须小心不要释放
ptr
。这也有点违背了
unique_ptr
的语义。当然,如果真正的问题是获取引用的地址是否与引用对象的地址相同,那么答案是“是”。在函数中使用它不是一个问题:并非所有函数都必须知道哪个智能指针控制对象,但是存储指针或在线程中使用指针可能会导致对象生命周期问题(悬空指针)
void Class::setStoredObject(const MustExist& obj) // ok for copy
void Class::setStoredObject(MustExist&& obj) // move semantics, expressing the fact that the caller is done using the object.