当返回一个集合指针时,客户端如何知道它是否需要销毁它?
When returning a collection pointer, how does the client know if it needs to destroy it?
假设我有一个原型:
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);
相关文章:
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 我如何知道作为参数的size_t在函数中是否有效?
- 如何知道地图中的最后一个元素是否被删除?
- 知道模板参数在编译时是否为 const char*?
- 程序如何知道静态变量是否需要初始化?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何知道文本文件中的输入是否是 C++ 中的有效数字
- 我想知道我是否可以将一个类分配给特定的成员数据并创建该类的实例
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- 如何在 Linux 下使用 c++ 知道文件是否被其他进程使用?
- 我创建了一个库,想知道设计是否效率低下
- 如何知道指针是否已在其他地方释放
- 是否可以知道树中的项目何时被重命名
- 是否可以知道非固定枚举者的范围
- 是否可以知道哪个库使用 ldd 拉入另一个库
- 是否可以知道该参数是否是默认的
- 是否可以知道是否包含标头
- 我是否需要知道算法的代码才能利用插入器和移动迭代器?