【发布时间】:2018-01-02 05:11:49
【问题描述】:
我正在设计一个基于 virtual 方法的 C++ 类接口,以便能够提供扩展点。
许多这些公共方法需要heap 分配的对象作为参数。
由于我正在使用现代 C++ 模式,因此我打算为此使用 std::unique_ptr 或 std::shared_ptr,但我对它们都存有疑问。
使用 std::unique_ptr 看起来像这样:
class IFoo {
virtual void doSomethingWithUser(std::unique_ptr<User> user) = 0;
}
强制调用者提供std::unique_ptr 有缺点:
- 调用者无法对提供的用户执行任何操作,因为它必须被移动
- 如果任何
doSomethingWithUser实现需要将用户存储在某个容器中,则不能从std::shared_ptr构造
对所有公共方法使用std::shared_ptr 可以解决问题,但我们必须支付额外的内存空间以及引用计数的原子递增和递减。
有什么我可以遵循的经验法则吗?
【问题讨论】:
-
“许多这些公共方法需要堆分配的对象作为参数。”嗯?这是什么意思?
-
@FredLarson 如上例所示,用户是堆分配的,它不在堆栈上。 (用户不能被设计复制,因此需要堆分配它)
-
我看不出堆与堆栈分配有什么关系。你的意思是你需要通过指针(或引用)而不是值传递?
-
@FredLarson 完全正确
-
@steazzalini 不可复制与需要堆分配无关。我的大部分课程都是堆栈分配的,但只能移动。如果移动不是一个选项,或者您需要具有指向值所有权的多态性,您可能需要堆分配。
标签: c++ interface heap-memory shared-ptr unique-ptr