我想强制一个对象在传递给函数之前应该存在:
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);
无论如何我还需要通过引用或地址存储该对象(大对象),所以我通常会抓住它的指针。
这样做安全吗?即获取引用的地址以引用原始的指向对象。
或者,我可以实现任何其他/更好的方式吗?
答案 0 :(得分:1)
这本身并没有错。当然,如果原始对象超出范围并被销毁,则保存的指向该对象的指针将不再有效。
答案 1 :(得分:1)
确保获得现有对象并且无法在不检查此情况下删除它的最安全方法是实例化并传递shared_ptr。这样你可以选择存储shared_ptr,这样你就可以确定它不会消失(但是你需要一些清理代码)或者存储为weak_ptr,这样你只能在它仍然存在的时候使用它。
存储由智能指针控制的对象的原始指针可能会导致非常微妙的问题,难以追溯到代码。
答案 2 :(得分:0)
一般来说,从 std :: unique_ptr 中获取和使用原始指针并不是一个好的设计,因为它打破了它的所有想法。
答案 3 :(得分:0)
取消引用ptr
并通过引用传递对象对于您要执行的操作并不是一个好的语义。
如果调用者上下文需要unique_ptr
,您应该使用:
void Class::setStoredObject(std::unique_ptr<MustExist> obj_ptr)
然后拨打电话
classObject.setStoredObject(std::move(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.