”返回在函数内malloc的内存是安全的,但是容易造成问题,最好的做法是返回传入的指针。“怎么理解?
关注者
26
被浏览
11,283
12 个回答
被调用的函数(callee)分配的内存,调用方(caller )是不清楚应该怎么释放(甚至要不要释放)的。
如果你观察 C 的标准库函数接口也会发现,他们尽量不在内部分配内存。
如果一定要 callee 来分配内存,也应该由 callee 同一模块的函数来释放内存。
举个例子。我曾经遇到过个堆错误导致崩溃的 bug,经过一番调试和网上搜索,发现问题出在我把 `std::string` 对象传递过了库的边界,碰巧 `std::string` 又是移动构造的。这导致内存由库分配,由调用库的应用释放。库和应用使用的是不同的 vcruntime 实例,堆的状态有两份,就导致了 assert 失败。
从逻辑上来说,如果资源是某一方分配的,也应该由它来释放,只有它知道状态是怎么管理的,分配释放有什么内部机制(甚至将来你想做什么优化,比如用上池,都得这样设计接口才好改)。