比方说我有原型:
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 ++世界中最常见的选项。如果没有标准的方法,我会接受一个符合个人喜好的答案。
答案 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);