如何防止删除由QSharedPointer管理的指针

时间:2010-11-11 13:54:47

标签: c++ qt pointers shared-ptr qsharedpointer

我在Qt应用程序中有一些间歇性的分段错误。我认为这个问题与我们(错误)使用QSharedPointer有关。 Qt Documentation states

  

QSharedPointer :: QSharedPointer(T * ptr):   创建一个指向ptr的QSharedPointer。指针ptr由此QSharedPointer管理,不得传递给另一个QSharedPointer对象在此对象外删除

我认为我们两个都做 ......:/

是否有一种OOP方式可以强制执行QSharedPointer管理的指针无法删除或传递给另一个QSharedPointer

最好的解决方案是编译错误。

4 个答案:

答案 0 :(得分:8)

正常模式是将new语句放在智能指针的构造函数中,如下所示:

QSharedPointer<Obj> p (new Obj(2)); 

这样你就永远不会引用裸指针了。

如果您重构代码以便所有新操作符都在这些行中,那么您的所有问题都将得到解决。

答案 1 :(得分:1)

嗯,一种OOP式的方法是将原始指针创建为包装类中的私有成员,并且只通过作用于共享指针的方法对指针执行操作。虽然有点傻,不是吗?

或者你可以让你的类使用原始指针作为其他类的基类,并使原始指针成为类中的私有成员。在这方面,你或多或少地创建了一个什么都不做的抽象类。你的衍生类必须完成所有工作,并且由于它们无法访问原始指针,编译将失败......但这并不能阻止某人仅仅将原始指针值复制出共享指针。

最后,我认为您最好的策略是手动更改所有有问题的函数,以使用共享指针或原始指针。你可以安全地将一个共享指针复制到另一个指针,那么为什么不这样做呢?

编辑: 我可能会补充一点,无论你是否使用共享指针,听起来你都有所有权问题。如果指针是在一个范围内创建的,则应该在该范围内删除它,除非它传递给合同的函数取得指针的所有权。在这种情况下使用共享指针最终只会导致不同的错误。听起来你的设计问题不仅仅是分享指针。

答案 2 :(得分:1)

我不熟悉共享指针的特定Qt实现,但作为一般指导原则:尝试将原始指针与托管指针混合通常以血液结束。一旦您“信任”共享指针实现获取动态分配数据的所有权,您在任何情况下都不应尝试自己管理对象生命周期(例如,通过删除提供的指针)。

是否有OOP方式强制执行QSharedPointer管理的指针无法删除?

我想你可以想象一些奇怪的技巧,其中尖头类型将有一个私有析构函数并声明QSharedPointer为朋友(这将有效地防止任何“外部删除”编译),但我不打赌任何好的东西都可以来除此之外(并注意它将使你的类型绝对无法使用,除非新的并转移到QSharedPointer)。

是否有一种OOP方式来强制QSharedPointer管理的指针无法传递给另一个QSharedPointer?

我想不出任何一个,这就是为什么一旦将所有权转移到QSharedPointer就应该避免操纵原始指针的另一个原因。

答案 3 :(得分:0)

检查代码中的所有.data()用法,并确保它们返回的内容既未存储也未删除。我不认为硬编译器错误会很好,因为有时可以传递原始指针,例如到一个不存储或删除传递指针的函数。 (特别是在使用第三方代码时,您不能总是更改所有内容以使用共享指针,并且通常希望它与原始和共享ptrs一起使用)。 可以将QSharedPointer :: data()标记为已弃用(通过修补Qt),以获得编译时警告。