我在QT应用程序中有一些间歇性分割故障。我认为问题与我们(不良)的使用有关 QSharedPointer. 。这 QT文档状态 :

qsharedPointer :: qsharedPointer(t * ptr):创建一个指向ptr的qsharedPointer。指针PTR由此qsharedPointer管理,并且 不得传递给另一个qsharedPointer对象 或者 在此对象外删除.

我认为我们正在做 一定不... :/

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

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

有帮助吗?

解决方案

正常模式是将 new 智能指针的构造函数中的声明:这样:

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

这样一来,您就永远不会提及裸指针本身。

如果您对代码进行重构,以便所有新运营商都在类似的行中,那么您的所有问题都将得到解决。

其他提示

好吧,一种OOP风格的方法是将原始指针作为包装班级的私人成员创建原始指针,而仅通过对共享指针作用的方法在指针上执行操作。有点愚蠢,不是吗?

或者,您可以将您的班级与原始指针一起成为其他类的基类,并将原始指针作为班级的私人成员。在这方面,您或多或少会创建一个无用的抽象类。您的派生类必须做所有的工作,并且由于它们无法访问原始指针,因此编译将失败...这并不能阻止某人仅将原始指针值从共享指针中复制出来。

最后,我认为您最好的政策是工艺更改所讨论的所有功能,以使用共享指针或原始指针。您可以安全地将一个共享指针复制到另一个指针,所以为什么不这样做呢?

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

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

是否有一种OOP强制执行QSHAREDPOINTER管理的指针?

我想您可以想象一些怪异的技术,尖头类型会有一个私人驱动器并将QsharedPointer宣布为朋友(这有效地阻止了任何“外部删除”编译),但我不会敢打赌,这一切都可以出现。 (并注意,除非新'并将其转移到qsharedpointer,否则它将使您的类型绝对无法使用。

是否有OOP强制执行QSHAREDPOINTER管理的指针不能传递给另一个QsharedPointer?

我想不出任何东西,这就是为什么将原始指针转移到QsharedPointer后应避免操纵原始指针的另一个原因。

查看所有.data()用法的代码,并确保其返回的内容尚未存储也不删除。我认为硬编译器错误不会很好,因为有时可以将原始指针传递到不存储或删除通过指针的函数。 (尤其是在使用第三方代码时,您不能总是更改所有使用共享指针的所有内容,并且通常希望它可以与RAW和共享PTR一起使用)。可以将qsharedPointer :: data()标记为已弃用(通过修补QT),以获取编译时间警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top