C++ 如何表示C++;指针的所有权
假设我有一门课:C++ 如何表示C++;指针的所有权,c++,pointers,api-design,C++,Pointers,Api Design,假设我有一门课: class Scheduler { Scheduler(JobService *service); AddJob(JobID id, ISchedule *schedule); } 构造函数获取指向服务的指针,但调度程序不获取服务指针的所有权。服务指针假定由调用方释放 AddJob的情况正好相反。调度生命周期由调度程序管理,当作业不再需要运行时,将释放调度内存 从API的角度来看,谁拥有指针和谁不拥有指针并不清楚。我想知道是否有一些技术通过API设计而不是通过
class Scheduler {
Scheduler(JobService *service);
AddJob(JobID id, ISchedule *schedule);
}
构造函数获取指向服务的指针,但调度程序不获取服务指针的所有权。服务指针假定由调用方释放
AddJob的情况正好相反。调度生命周期由调度程序管理,当作业不再需要运行时,将释放调度内存
从API的角度来看,谁拥有指针和谁不拥有指针并不清楚。我想知道是否有一些技术通过API设计而不是通过文档来表明意图。让它更简单明了
如果我可以,我将构造ISCHPLIE实例,但它是C++中的抽象类(接口),因此对于每个类型的调度创建添加重载都是不实际的。因此,我必须在Add中使用指针。
您没有任何选项(除了清晰的文档)来指示原始指针的所有权 这就是来自的智能指针的用途:
将所有权传递给接收方std::unique_ptr
持有人之间的股份所有权std::shared_ptr
表示从属共享std::weak_ptr
正如专用参考中指出的,可以用来表示严格的生命周期依赖关系。传递
std::unique\u ptr
是一种传递对象所有权的惯用方法。因此,这是一个正确的方法来进行AddJob
传递原始指针表示未转移所有权
显然,
std::shared\u ptr
表示所有权共享。场景的数量多于两个
class Scheduler {
// pass the raw pointer (or use a reference) to expresses
// no ownership transfer (The passed in object will no longer be
// needed after the pointer or reference becomes invalid)
Scheduler(JobService* service);
Scheduler(JobService& service);
// use a std::unique_ptr to pass ownership
AddJob(JobID id, std::unique_ptr<ISchedule> schedule);
// use a std::shared_ptr to pass shared ownership
// when the passed in object needs to outlive either the caller
// or the receiver and either one may need to delete it
SomethingElse1(std::shared_ptr<Stuff> stuff);
// use a std::weak_ptr to pass shared ownership
// when the object may, or may not outlive
// the receiver and the receiver needs to be able to detect
// if the pointer is still valid (like an intermittent service)
SomethingElse2(std::weak_ptr<Stuff> stuff);
};
类调度程序{
//将原始指针(或使用引用)传递给表达式
//无所有权转移(传入的对象将不再是
//指针或引用无效后需要)
调度器(作业服务*服务);
调度员(作业服务和服务);
//使用std::unique\u ptr传递所有权
AddJob(JobID id,std::unique_ptr schedule);
//使用std::shared\u ptr传递共享所有权
//当传入的对象需要比调用方或
//或者接收者,任何一方都可能需要删除它
somethingels1(std::shared_ptr stuff);
//使用std::weak_ptr传递共享所有权
//当对象可能存在,也可能不存在时
//接收器和接收器需要能够检测到
//如果指针仍然有效(如间歇性服务)
某物2(标准:弱ptr物质);
};
参考文献:
将智能指针作为参数仅显式表示生命周期语义
使用唯一的_ptr参数表示函数拥有小部件的所有权
获取一个shared_ptr参数来表示函数是部分所有者如果您使用的是C++11或更高版本,请更改
AddJob()
以std::unique_ptr
或std::shared_ptr
作为输入,这样就没有问题了ownership@Remy我们真的需要引用过时的C++标准吗?@ USER442是的。很多人还没有使用C++11。模板void AddJob(JobID,Ts&&…
允许从调度器
构建计划
。嵌入式软件开发在标准支持方面比较棘手;不要判断。明确无所有权。@Jarod好吧,到目前为止,这列在“实验性”下。我的意思是,“无所有权”也可以有明确的类别(实验性的,家庭女佣,…)。因为常规指针可能会被“误用”。/OT@Jarod42“家庭女佣”我希望有一个在这里日复一日地清理所有的脏乱;-)“(此对象在指针无效之前终止)”。这取决于:调度器
可以只使用作业服务
的内容,然后服务就可以立即终止;或者它可以存储其引用,然后添加生存期约束。我甚至忘了提到普通引用是另一种选择。@Jarod42是的,我假设将所有权传递给对象,而不是函数(我认为这在问题中是隐含的),但我更改了措辞以涵盖这两种内容。