如果删除用于释放使用malloc()获得的内存,是否应该产生警告或甚至断言失败?

ahe*_*ang 14 c++ malloc memory-management

在C++中使用delete释放所获得的内存malloc()并不一定会导致程序爆炸.

如果delete用于释放使用的内存,是否应该产生警告或甚至断言失败malloc()

为什么Stroustrup在C++上没有这个功能?

Jam*_*lis 22

在C++中使用delete来释放使用malloc()获得的内存并不一定会导致程序爆炸.

不,但它确实会导致未定义的行为,这意味着任何事情都可能发生,包括程序爆炸或程序继续以看似正确的方式运行.

如果删除用于释放使用malloc()获得的内存,你们是否认为应该产生警告或者甚至是断言失败?

不.在编译时检查是很困难的,如果不是不可能的话.运行时检查很昂贵,而在C++中,你没有得到你不付出的代价.

在调试时打开它可能是一个有用的选项,但实际上,正确的答案是不要混合和匹配它们.我没有遇到过这个问题.

  • @Alexander:因为运行时检查增加了开销,我不想每次删除东西时浪费CPU周期,检查一些错误,这在设计良好的软件中确实是不可能的(如果软件项目有一个很大的问题) ,它肯定会误用指针). (2认同)
  • @Alexander:还是.考虑到多种方法,您可以使用错误的函数/运算符来删除C++中的内存管理,这是最简单的错误. (2认同)
  • @EquinoX:在C++中,如果你使用智能指针,值对象和RAII,你会比你想象的要少得多`delete`或`free`.你要求的那种保护类似于为喜欢在窗外骑车的人增加汽车头盔...... (2认同)

a s*_*cat 9

delete有一个特殊的属性free()不会:它调用析构函数,反过来可能会调用更多的删除,因为该对象可能已经在堆上分配了其他东西.

也就是说,new也调用对象的构造函数,而malloc()不是.除非你完全确定你知道自己在做什么,否则不要混用这些东西(如果你这样做,你也不会混淆这些东西).

  • 因为没有办法说出来.该指针可能来自任何地方,你可以从其他地方投射它.编译器在编译时无法知道这一点. (4认同)