c++ - 删除还是不删除(调用函数)?

标签 c++

我记得有人说过,如果你通过库创建一个类,你应该通过库销毁它。那么,这是否意味着我不应该调用 delete?我应该改为调用 myclass.deleteMe() 吗?重载 delete 会解决问题吗?

最佳答案

I remember someone saying if you create a class through a lib you should destroy it through the lib.

这意味着如果您调用库中的一个函数来为您创建一个对象,您应该阅读该函数的文档,其中必须说明您如何再次释放该对象。 free something 的函数通常被命名为类似于 allocation 函数。例如,库 pcre 有两个函数,分别是 pcre_mallocpcre_free

原因是,因为库以一种对您不透明的方式进行分配(这是您首先使用该函数的原因)。它可以从程序的数据部分获取内存,而您会(错误地)假设它在使用 delete 时可能从堆中获取内存。

如果 是那个库作者,同样的规则适用。确保当你的一个函数返回一个动态分配的对象时,你说了调用者必须如何处理它

  1. 对象是否封装成智能指针?然后智能指针将负责调用您指定的适当删除器
  2. 你会返回原始指针吗?您应该避免这种情况,因为调用者必须跟踪指针,并且调用者必须将指针传递给您界面中的函数文档。这只是您对图书馆用户负担的另一种依赖程度,智能指针可以优雅地将其合理化。
  3. 你是否按值返回一个对象,它本身包装了一个分配的资源?如果是这种情况,请重载该对象类的复制构造函数、复制赋值运算符和析构函数,然后通过正确复制资源或在其对象的所有其他实例之间共享资源来管理资源(参见 this answer )。<

您几乎不应该为您的类重载 delete 运算符,除非您还重载了 new 运算符。重载 delete 运算符并不是字面上的意思:它意味着您只是重载对象的关联内存的解除分配。仅当您拥有自己的内存池或想要记录对象的每次内存分配/解除分配时才有意义。

关于c++ - 删除还是不删除(调用函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/409198/

相关文章:

c++ - 使用 C++ 修复 .txt 文件中的列宽

c++ - 如何二维访问 CUDA 内核中的内存?例如d_A[i][j]

c++ - 制作可变参数模板类的 forward_list

c++ - recv() 与 errno=107 :(transport endpoint connected)

c++ - boost::program_options 从控制台读取整数数组

c++ - (Qt)同时针对多个正则表达式验证字符串

c++ - 将目录迭代器切换为同一循环的递归?

c++ - boost::variant 并获取要为 msgpack 编码的数据

c++ - 在不更改索引顺序的情况下从动态数组中删除元素

c++ - 有没有办法使用 std::sort() 并仍然保持基于 1 的索引?