1

我在 Qt 应用程序中有一些间歇性分段错误。我认为问题与我们(不良)使用QSharedPointer. Qt文档指出

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

我认为我们两者都不能... :/

有没有一种面向对象的方法来强制QSharedPointer不能删除或传递给另一个管理的指针QSharedPointer

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

4

4 回答 4

8

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

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

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

如果你重构你的代码,让所有新的操作符都在这样的行中,你所有的问题都将得到解决。

于 2010-11-11T14:12:30.090 回答
1

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

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

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

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

于 2010-11-11T14:02:02.793 回答
1

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

有没有一种面向对象的方法来强制 QSharedPointer 管理的指针不能被删除?

我想你可以想象一些奇怪的技术,其中指向的类型会有一个私有析构函数并将 QSharedPointer 声明为朋友(这将有效地防止任何“外部删除”编译),但我不打赌这会产生任何好处(请注意,除非更新并转移到 QSharedPointer,否则它将使您的类型绝对无法使用)。

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

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

于 2010-11-11T14:11:44.173 回答
0

检查您的代码以了解所有 .data() 使用情况,并确保它们返回的内容既未存储也未删除。我不认为硬编译器错误会很好,因为有时可以传递原始指针,例如传递给既不存储也不删除传递的指针的函数。(特别是在使用 3rd-party 代码时,您不能总是将所有内容都更改为使用共享指针,并且通常您希望它同时使用原始和共享指针)。可以将 QSharedPointer::data() 标记为已弃用(通过修补 Qt),以获得编译时警告。

于 2010-11-12T13:21:21.530 回答