C++ 如何防止删除QSharedPointer管理的指针
我在Qt应用程序中有一些间歇性分段错误。我认为问题与我们(错误地)使用C++ 如何防止删除QSharedPointer管理的指针,c++,qt,pointers,shared-ptr,qsharedpointer,C++,Qt,Pointers,Shared Ptr,Qsharedpointer,我在Qt应用程序中有一些间歇性分段错误。我认为问题与我们(错误地)使用QSharedPointer有关。委员会: QSharedPointer::QSharedPointer(T*ptr): 创建指向ptr的QSharedPointer。指针ptr由该QSharedPointer管理,并且不得传递给另一个QSharedPointer对象,也不得在该对象之外删除 我认为我们正在做这两件事,决不能…:/ 是否有一种面向对象的方法来强制执行由QSharedPointer管理的指针不能被删除或传递给另一
QSharedPointer
有关。委员会:
QSharedPointer::QSharedPointer(T*ptr):
创建指向ptr的QSharedPointer。指针ptr由该QSharedPointer管理,并且不得传递给另一个QSharedPointer对象,也不得在该对象之外删除
我认为我们正在做这两件事,决不能…:/
是否有一种面向对象的方法来强制执行由QSharedPointer
管理的指针不能被删除或传递给另一个QSharedPointer
最好的解决方案是出现编译器错误。好的,OOP风格的方法是将原始指针创建为包装类中的私有成员,并且仅通过作用于共享指针的方法对指针执行操作。不过有点傻,不是吗 或者,可以将具有原始指针的类作为指向其他类的基类,并将原始指针作为类中的私有成员。在这方面,您或多或少创建了一个不做任何事情的抽象类。您的派生类必须完成所有工作,因为它们无法访问原始指针,编译将失败。。。不过,这并不能阻止某人从共享指针中复制原始指针值 最后,我认为您最好的策略是手动更改所有相关函数以使用共享指针或原始指针。您可以安全地将一个共享指针复制到另一个,那么为什么不这样做呢 编辑:
我可能会补充说,无论您是否使用共享指针,听起来您都有所有权问题。如果指针是在一个作用域中创建的,则应该在该作用域中删除它,除非传递给它的函数以契约形式获得指针的所有权。在这种情况下使用共享指针最终只会导致不同的错误。听起来你的设计问题不仅仅是指针的共享。好吧,OOP风格的方法是将原始指针创建为包装类中的私有成员,并且只通过作用于共享指针的方法对指针执行操作。不过有点傻,不是吗 或者,可以将具有原始指针的类作为指向其他类的基类,并将原始指针作为类中的私有成员。在这方面,您或多或少创建了一个不做任何事情的抽象类。您的派生类必须完成所有工作,因为它们无法访问原始指针,编译将失败。。。不过,这并不能阻止某人从共享指针中复制原始指针值 最后,我认为您最好的策略是手动更改所有相关函数以使用共享指针或原始指针。您可以安全地将一个共享指针复制到另一个,那么为什么不这样做呢 编辑:
我可能会补充说,无论您是否使用共享指针,听起来您都有所有权问题。如果指针是在一个作用域中创建的,则应该在该作用域中删除它,除非传递给它的函数以契约形式获得指针的所有权。在这种情况下使用共享指针最终只会导致不同的错误。听起来你的设计问题不仅仅是指针的共享。我不熟悉共享指针的特定Qt实现,但作为一个一般的指导原则:尝试将原始指针与托管指针混合通常会导致流血。一旦您“信任”共享指针实现获得动态分配数据的所有权,在任何情况下都不应尝试自己管理对象生存期(例如,通过删除提供的指针) 有没有一种面向对象的方法来强制QSharedPointer管理的指针不能被删除? 我想你可以想象一些奇怪的技术,在这种技术中,pointed类型会有一个私有析构函数,并将QSharedPointer声明为friend(这将有效地防止任何“外部删除”的编译),但我不敢打赌这会带来任何好处(请注意,它将使您的类型完全不可用,除非新建并转换为QSharedPointer) 是否有一种面向对象的方法来强制QSharedPointer管理的指针不能传递给另一个QSharedPointer?
我想不出任何原因,这也是为什么在原始指针的所有权转移到QSharedPointer后,您应该避免操作它的另一个原因。我不熟悉共享指针的特定Qt实现,但作为一个一般准则:尝试将原始指针与托管指针混合使用通常会导致流血。一旦您“信任”共享指针实现获得动态分配数据的所有权,您在任何情况下都不应尝试自己管理对象生存期(例如,通过删除提供的指针) 有没有一种面向对象的方法来强制QSharedPointer管理的指针不能被删除? 我想你可以想象一些奇怪的技术,在这种技术中,pointed类型会有一个私有析构函数,并将QSharedPointer声明为friend(这将有效地防止任何“外部删除”的编译),但我不敢打赌这会带来任何好处(请注意,它将使您的类型完全不可用,除非新建并转换为QSharedPointer) 是否有一种面向对象的方法来强制QSharedPointer管理的指针不能传递给另一个QSharedPointer? 我想不出任何原因,这也是为什么在原始指针的所有权转移到QSharedPointer之后,您应该避免操作它的另一个原因。
QSharedPointer<Obj> p (new Obj(2));