返回集合指针时,客户端如何知道是否需要销毁它?

时间:2013-06-09 18:43:51

标签: c++ qt smart-pointers qt5

比方说我有原型:

QList<Foo *> *methodBar(int someParam);

此方法返回一个指向客户端代码的QList指针 - 客户端代码如何知道是否需要销毁返回的指针?

是否有一项惯例表明,如果给你一个指针,你的业务是控制它的记忆?反之亦然?

我想解决的问题是:

选项1: 将文档记录在doc块中,客户端代码在完成后必须将其除去QList。

选项2 将签名更改为:

void methodBar(int someParam, QList<Foo *> &listForOutput);

这样客户端代码就会创建列表,并且肯定知道它应该在完成后销毁它。

选项3 使用某种智能指针,我不确定这是否有效,但如果我在QList*内包裹QPointer并返回QPointer的副本,我认为它会浅显复制内部QList*,然后当QPointer超出客户端代码范围时,它将与QList*一起销毁。

那么这些选项中的哪一个(或者其他可能的东西?)是c ++世界中最常见的选项。如果没有标准的方法,我会接受一个符合个人喜好的答案。

1 个答案:

答案 0 :(得分:4)

如果您希望调用者知道他们对指针负责,那么请使用:

std::unique_ptr<QList<Foo *>> methodBar(int someParam);

另一个优点是调用者必须竭尽全力使内存不被自动释放。

std::unique_ptr无法复制,只能移动,因此公平地传递std::unique_ptr会导致释放内存的责任从被叫方移动到调用方。

请注意,这也意味着列表中指向的对象不是调用者的责任。如果您希望这些对象也是调用者的责任,您可以使用:

std::unique_ptr<QList<std::unique_ptr<Foo>>> methodBar(int someParam);