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

标签 c++ qt smart-pointers qt5

假设我有原型(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/

相关文章:

c++ - 使c++程序以交互方式将输入输出传递给windows命令提示符

c++ - Qt - DLL 中的对话框

c++ - QTableWidgetDervied::cellChanged

python - 暂停 python 脚本,直到事件发生而不挂起/阻塞 GUI

c++ - 下面的 C++ shared_ptr 用法会不会有任何泄漏?

c++ - 如何在 lambda 中捕获智能指针?

c++ - 私有(private)使用基构造函数的声明不是私有(private)的

c++ - 加载 libtesseract302d.dll 时崩溃?

c++ - 这是 unique_ptr 的正确用法吗?

c++ - 碰撞后从方向取消表面轴