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

When returning a collection pointer, how does the client know if it needs to destroy it?

本文关键字:是否 何知道 客户端 返回 一个 指针 集合      更新时间:2023-10-16

假设我有一个原型:

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

这个方法返回一个QList指针给客户端代码——客户端代码如何知道它是否需要销毁返回的指针?

是否有一个约定说,如果你给一个指针,它的业务,以控制它的内存?反之亦然?

我解决这个问题的想法是:

选项1:在文档块中记录它,客户端代码一旦完成QList就必须摆脱它。

选项2 将签名更改为如下内容:

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

以便客户端代码创建列表,并明确知道它应该在完成时销毁它。

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

那么在c++世界中,哪一个选项(或者其他选项?)是最常见的呢?如果没有标准的方法,我会接受一个答案,这取决于个人喜好。

如果你想让调用者知道他们对指针负责,那么使用这个:

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);