假设我有原型(prototype):
QList<Foo *> *methodBar(int someParam);
此方法向客户端代码返回一个 QList 指针 - 客户端代码如何知道是否需要销毁返回的指针?
是否有一个惯例规定,如果给你一个指针,你就可以控制它的内存?或者反之亦然?
我解决这个问题的想法是:
选项 1: 在文档 block 中记录客户端代码在使用完 QList 后必须删除它。
选项 2 将签名更改为:
void methodBar(int someParam, QList<Foo *> &listForOutput);
以便客户端代码创建列表并且明确知道它应该在完成时销毁它。
选项 3
使用某种智能指针,我不确定这是否有效,但如果我将 QList*
包装在 QPointer
内并返回 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);
关于c++ - 当返回集合指针时,客户端如何知道是否需要销毁它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012933/