C++11 将唯一的\u ptr映射到共享的\u ptr设计

C++11 将唯一的\u ptr映射到共享的\u ptr设计,c++11,shared-ptr,unique-ptr,C++11,Shared Ptr,Unique Ptr,我在我的主应用程序中有一个唯一的_ptr(它为其他应用程序提供一些服务)。 现在,我想将这个unique_ptr实例共享给多个需要主应用程序提供服务的应用程序 主应用程序将是唯一的\u ptr对象的所有者 例如,我唯一的_ptr对象可能有一组Qt信号,其他应用程序将监听这些信号以进行服务 现在我正在从unique_ptr获取原始指针并将其返回给其他应用程序,但是如果某个应用程序删除该原始指针会发生什么情况 我是否应该将我的unique_ptr更改为shared_ptr,并将弱_ptr分配给其他

我在我的主应用程序中有一个唯一的_ptr(它为其他应用程序提供一些服务)。 现在,我想将这个unique_ptr实例共享给多个需要主应用程序提供服务的应用程序

主应用程序将是唯一的\u ptr对象的所有者

例如,我唯一的_ptr对象可能有一组Qt信号,其他应用程序将监听这些信号以进行服务

现在我正在从unique_ptr获取原始指针并将其返回给其他应用程序,但是如果某个应用程序删除该原始指针会发生什么情况


我是否应该将我的unique_ptr更改为shared_ptr,并将弱_ptr分配给其他应用程序?

如果您没有生存期问题,则没有必要切换到使用
shared_ptr
而不是
unique_ptr

关于界面中的原始指针,我同意这可能会产生误导。
也许使用一个引用就足够了,或者使用一个不透明的结构来包装引用并从外部提供更好的接口。

转换为共享的ptr并传递弱的ptr似乎是一个好主意。您无法防止在同一进程中运行写得不好的代码。例如,一个坏的调用者可能会通过缓冲区溢出破坏堆,并导致主组件在一个看似无关、无害的内存分配中崩溃。在我的拙见中,一个原始指针完全代表其他人拥有的资源。定义C和C++不是安全的语言,不能成为一个。我所看到的试图为这两种语言创建一个安全的“子集”的尝试充其量只是一个玩笑,坦率地说更像是一个骗局,因为它们甚至不是正确的子集(它们添加了一些构造),并且排除了这两种语言的几乎所有常用特性,因此实际上没有真正的程序会出现在所谓的子集中。您必须使用完全不同的PL,甚至“安全”PL有时也会提供您真正需要使用的不安全特性和接口!您无法针对明显的编程错误进行设计,例如显式删除不应删除的内容。但是,您可以将delete对象的字节丢弃,以便任何尝试使用其值的行为都会导致快速的程序错误行为,这比后期的程序错误行为更容易检测和诊断。你可以做很多简单的事情来让编程错误在运行时变得更加明显,也可以使用更复杂的工具来帮助你?