如何防止在C++中无意中使用删除和自由交换?

S I*_*S I 1 c++ free memory-management

当,如果有的话,可以deletefree互换在C++中使用?

我的担忧如下:假设使用malloc/ freenew/ delete(更不用说new[]/ delete[])有不正确的混淆.然而delete,free做同样的事情;
幸运的是,这在测试中没有受到影响.稍后这可能会导致生产崩溃.

我怎样才能强制执行某种检查以防止这种情况发生?如果这两个人混在一起,我可以得到警告吗?如果不是在编译时,可能在运行时有一些代码检测?我该如何处理?

这个问题的目的是找到避免在使用中无意混淆的方法.

小智 11

不让它们混淆的简单方法是永远不要使用malloc(),那么你永远不会想要调用free().为避免此问题而创建的基础结构称为"代码审查",但在这种情况下,快速"grep malloc("或"grep free("在代码库上可能就足够了).


Jar*_*Par 7

决不.如果它的工作原理是纯粹的实施意外.不要依赖这种行为.

  • 这就是问题的关键 - 通过实施意外,错误不会在测试中暴露出来.如何创建基础架构来捕获这样的内存问题? (2认同)
  • @SI,我接受Neil的方法,禁止malloc并完全免费使用你的应用程序. (2认同)

MSN*_*MSN 5

要回答第二个问题,如果你同时控制malloc/ freeoperator new/ delete,你可以存储额外的信息,以便与两者返回的指针相关联,告诉你它们是如何分配的.当指针传递给free或时operator delete,检查它是否由相应的函数分配.如果没有,则断言或提出异常或做任何事情来报告不匹配.

通常这是通过分配额外的内存来完成的,例如,给定malloc(size)或者operator new(size),你size + additional space在那里分配和推送额外的信息.


jal*_*alf 5

你可以确保永远不会让他们混淆的唯一方法是:

  • 从不首先使用malloc/free,或者
  • 依靠RAII进行内存分配.保护RAII对象中的每个内存分配,确保内存在超出范围时正确且一致地释放,或者将分配包装在智能指针中.

手动调用删除免费只是一个bug的邀请.