【发布时间】:2016-07-17 21:46:12
【问题描述】:
关于通过引用或指针传递以及何时使用指针的问题有很多。
到目前为止我对该主题的理解是以下规则:
- 总是尝试通过引用传递
- 如果必须通过指针传递(仅使用指针)
在我的例子中,我必须使用指针来保留多态行为,因为我将传递的对象存储到向量中以供以后使用(这是一个“添加”方法)。
见:C++ Overridden method not getting called
我已阅读:
- shared_ptr by reference or by value? 专门讨论了传递 shared_ptrs
- Passing shared pointers as arguments 告诉我,如果我试图转移所有权,我应该只通过 shared_ptr,但后来又说我应该通过引用传递
- Should I use std::shared pointer to pass a pointer? 这几乎告诉了我上一个问题告诉我的内容,但在 unique_ptr 的上下文中
所以我的问题是:
如果我试图传递一个已包含在 shared_ptr 中的指针以添加到向量中,我应该
- 传递对要添加到向量中的 shared_ptr 的引用(因为其他方法不实用)
或
- 使用 shared_ptr::get 获取实际指针,传递该指针,使用 shared_ptr::reset 重新包装它,然后将其添加到向量中? (因为如果我要转移所有权,我应该只传递智能指针)
代码:
//method definition
void addToVector(shared_ptr<Object>& obj) {
myVector.push_back(obj);
}
//call
shared_ptr<Object> myObj = make_shared<Object>();
addToVector(myObj);
或
//method definition
void addToVector(Object* obj) {
shared_ptr<Object> toAdd;
toAdd.reset(obj);
myVector.push_back(toAdd);
}
//call
shared_ptr<Object> myObj = make_shared<Object>();
addToVector(myObj.get());
【问题讨论】:
-
这取决于,你需要给我们指向对象的生命周期。
-
“始终尝试通过引用传递”的“规则”不是我想遵循的规则。通过引用传递本机数据类型(如
int或double)没有意义,除非函数应该修改值。 -
@RichardCritten 指向的对象将持续到程序结束
-
关于你的最后一个例子,这实际上很糟糕,会导致未定义的行为。你突然有两个不同的
std::shared_ptr对象包装同一个指针,彼此不知道。如果一个上的引用计数器变为零,则内存被删除,但另一个共享指针对象仍然有一个指向(现在已删除)对象的指针。 -
@Yidna:不会有任何区别。你说过,对象一直持续到程序结束。如果这是真的,那么无论对象是否被向量引用,它都保持为真。所以使用
shared_ptr是没有意义的,因为shared_ptr的全部目的是管理对象的生命周期,实际上您已经说过这些对象不需要管理它们的生命周期。
标签: c++ pointers vector reference shared-ptr