我在Qt应用程序中有一些间歇性的分段错误。我认为这个问题与我们(糟糕的)使用QSharedPointer有关。Qt文档状态:
QSharedPointer::QSharedPointer (T* ptr ):创建指向ptr的QSharedPointer。指针ptr由此QSharedPointer管理,不能传递给在此对象之外删除的另一个QSharedPointer对象或。
我认为我们同时做的是不能.
是否有OOP方式强制QSharedPointer管理的指针不能删除或传递给另一个QSharedPointer?
最好的解决方案是有一个编译器错误。
发布于 2010-11-11 14:12:30
通常的模式是将new语句放入智能指针的构造函数中,如下所示:
QSharedPointer<Obj> p (new Obj(2)); 这样,您就不会有对裸指针本身的引用。
如果您重构代码,使所有新运算符都在类似的行中,那么您的所有问题都将得到解决。
发布于 2010-11-11 14:02:02
好的,OOP-esque的一种方法是将原始指针创建为包装类中的私有成员,并且只通过对共享指针进行操作的方法对指针执行操作。不过有点傻,不是吗?
或者,可以使用原始指针使类成为指向其他类的基类,并使原始指针成为类中的私有成员。在这方面,您或多或少地创建了一个什么都不做的抽象类。派生类必须完成所有工作,由于它们无法访问原始指针,编译将失败.不过,这并不能阻止某人将原始指针值从共享指针中复制出来。
最后,我认为您的最佳策略是手动将所有相关函数更改为使用共享指针或原始指针。您可以安全地将一个共享指针复制到另一个共享指针,那么为什么不这样做呢?
编辑:我可能补充说,不管您是否使用共享指针,听起来您都有所有权问题。如果指针是在一个作用域中创建的,则应该删除该范围内的指针,除非传递给它的函数以合约方式获得指针的所有权。在这个场景中使用共享指针最终只会导致不同的错误。听起来,除了分享指针之外,您还有更多的设计问题。
发布于 2010-11-11 14:11:44
我不熟悉共享指针的特定Qt实现,但作为一般指导原则:尝试将原始指针与托管指针混合通常以血液结尾。一旦您在获得动态分配数据的所有权时“信任”共享指针实现,那么在任何情况下您都不应该尝试自己管理对象的生存期(例如,删除提供的指针)。
是否有一种OOP方式来强制QSharedPointer管理的指针不能删除?
我想您可以想象一些奇怪的技术,在这种技术中,尖头类型将有一个私有析构函数,并声明QSharedPointer为好友(这将有效地防止任何“外部删除”编译),但我不能打赌这会带来任何好的结果(请注意,它将使您的类型绝对不可用,除非新的‘’ed‘和转移到一个QSharedPointer)。
是否有一种OOP方式来强制QSharedPointer管理的指针不能传递给另一个QSharedPointer?
我想不出任何问题,这也是为什么当原始指针的所有权被转移到QSharedPointer时,应该避免操作它的另一个原因。
https://stackoverflow.com/questions/4155088
复制相似问题