malloc/free 和 new/delete 有一个很好的比较here https://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free以及 malloc() 和 free() 如何工作的良好解释here https://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work。显然,我们不会混合使用它们——将 free 与 new 一起使用,或者将 delete 与 malloc 一起使用。
我们可以看到很多开源项目,有很多贡献者,使用这两种机制,同时遵守上述“不混合”规则。通常,一个文件中只有一种方式(一位作者,一种偏好)。我已经分叉了这样一个项目,并且我使用 new/delete 添加了一些功能。但我遇到了一些奇怪的记忆损坏。当然,我可能对他们负有责任,但是......
这让我问了一些“天真的”问题:
我可以在同一个编译单元(*.o)中同时使用 malloc/free 和 new/delete 两种机制吗?当然,要遵守“不混合”规则?
-
我可以像这段代码一样交织这两种机制吗?
int *a = (int *) malloc (1000 * sizeof int);
int *b = new int[1000];
// some code
free a;
delete[] b;
是的,您可以交错它们 - 只需使用与分配所用函数匹配的释放函数即可。仅当您使用错误的释放函数时才会出现问题。
请注意,当您有多个库时,这并不容易 - 这些库可能使用不同的堆,因此即使您使用正确命名的函数,它也可能碰巧在错误的模块中实现,因此使用错误的堆,这将导致您陷入未定义状态行为。看这个答案 https://stackoverflow.com/a/19131623/57428为了更好地了解我在这里所说的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)