我记得有人说如果你通过lib创建一个类,你应该通过库来销毁它.那么,这是否意味着我不应该叫删除?我应该打个电话myclass.deleteMe()
?重载删除会解决问题吗?
我记得有人说如果你通过lib创建一个类,你应该通过lib来销毁它.
这意味着如果你在lib中调用一个函数为你创建一个对象,你应该阅读该函数的文档,它必须说明你如何再次释放该对象.通常,免费内容的函数被命名为类似于分配函数.例如,库pcre
有两个名为pcre_malloc
和的函数pcre_free
.
原因是,因为库以一种对你不透明的方式分配(这是你首先使用该函数的原因).它可以从程序的数据部分获取内存,而你(错误地)假设它在使用时可能从堆中获取内存delete
.
如果您是该图书馆作家,则适用相同的规则.确保当其中一个函数返回动态分配的对象时,您会说出调用者必须如何处理它
对象是否封装成智能指针?然后智能指针将负责调用您指定的相应删除器.
你是否返回原始指针?你应该避免这种情况,因为调用者必须跟踪指针,调用者必须将指针传递给你在界面中记录的函数.这只是你对图书馆用户负担的另一个依赖程度,哪些智能指针可以优雅地合理化.
您是否按值返回一个对象,它本身包含一个已分配的资源?如果是这种情况,请重载该对象类的复制构造函数,复制赋值运算符和析构函数,然后通过正确复制或在其对象的所有其他实例之间共享资源来管理资源(请参阅此答案).
您几乎不应该为您的类重载delete运算符,除非您还重载了new运算符.重载delete运算符不是字面意思:它意味着你只是重载对象的相关内存的重新分配.只有在您拥有自己的内存池或想要记录对象的每个内存分配/释放时才有意义.