Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何表示C++;指针的所有权_C++_Pointers_Api Design - Fatal编程技术网

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是的,我假设将所有权传递给对象,而不是函数(我认为这在问题中是隐含的),但我更改了措辞以涵盖这两种内容。