【发布时间】:2019-11-22 07:11:52
【问题描述】:
考虑以下类:
class A {
public:
A() {};
protected:
int m1;
float m2;
// ...
}
class B {
public:
B() { };
void add1(std::shared_ptr<A> _obj) {
data.push_back(_obj);
};
void add2(A* _obj) {
data.push_back(_obj);
};
void add3(A& _obj) {
data.push_back(&_obj);
};
private:
std::vector<std::shared_ptr<A>> data;
}
B 类中的哪些方法addX 更适合/最佳实践将新指针传递给向量?考虑到 data 是非常量智能指针的向量,我知道不可能通过 const 引用传递对象或智能指针而不必“解除”它们,这是不可取的,被认为是不好的做法。但是,除非我弄错了,否则所有这些方法最终都会实例化shared_ptr,然后将其复制到向量中?它们之间有什么区别?
【问题讨论】:
-
所有 3 个都有不同的含义,第 3 个实际上是错误的(我无法想象任何不危险的用例)。选择方法时必须考虑对象的所有权。哪一方应持有该对象的所有权?
add的来电者?B?两者都有? -
在这种情况下,所有权在设计上应该是共享的,因此我使用
shared_ptr。然而,A的实例被假定在B的范围之外被实例化,但是在附加到成员向量之后,B 可以对其进行任何处理。 -
选项 2 未使用共享所有权。您希望调用者将所有权传递给
B,因为B将delete指针。您需要在文档中明确说明。 -
请注意,您也可以传递
std::unique_ptr<A>或std::weak_ptr<A>。add1可以接受 -
@Caleth 比普通的
shared_ptr有什么优势吗?例如,unique_ptr是否更小,因此更易于移动?
标签: c++ parameter-passing smart-pointers