【发布时间】:2013-06-09 18:43:50
【问题描述】:
比如说我有原型:
QList<Foo *> *methodBar(int someParam);
此方法返回一个指向客户端代码的 QList 指针——客户端代码如何知道它是否需要销毁返回的指针?
有没有约定如果给你一个指针,控制它的内存是你的事?还是反过来?
我解决这个问题的想法是:
选项 1: 在文档块中记录它,客户端代码一旦完成就必须摆脱 QList。
选项 2 将签名更改为:
void methodBar(int someParam, QList<Foo *> &listForOutput);
以便客户端代码创建列表并且明确知道它应该在完成时将其销毁。
选项 3
使用某种智能指针,我不确定这是否有效,但如果我将QList* 包装在QPointer 中并返回QPointer 的副本,我认为它会浅复制内部QList* 然后当QPointer 超出客户端代码的范围时,它将与QList* 一起被销毁。
那么,这些选项中的哪一个(或者其他选项?)在 c++ 世界中是最常见的。如果没有这样做的标准方法,我会接受这取决于个人喜好的答案。
【问题讨论】:
-
通常这是由命名约定来处理的。例如 cocoa(目标 c)使用
newXYZ、allocXYZ、copyXYZ和mutableCopyXYZ将其标记为调用者的责任。 -
还有任何以
const返回的东西都保证是对象的责任,因为不允许调用者释放它(没有危险的强制转换) -
老实说,这与 Qt 关系不大,我会考虑删除 Qt 部分并使其成为更一般的 C++11 问题(使 QList 成为 std::vector 或类似的东西)。有关智能指针使用模式的更多参考,请参阅。 herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers 和 herbsutter.com/2013/06/05/… .
-
@peppe:感谢 Peppe 提供的这些链接。我同意这是一个通用的 c++ 问题,也许 Qt 元素和标签会产生噪音。我不确定我是否要编辑它,因为接受的答案也包含 Qt 元素,这可能会使事情有些脱节。如果版主认为最好同时更改两者,那么我对此没有问题。
-
这正是避免使用原始指针而使用 smart_pointers 的原因。接口定义不明确。
标签: c++ qt smart-pointers qt5