c是malloc和free,
c++是new和delete,(C++面向对象的)
区别如下:
(1)new、delete 是操作符,可以重载,只能在C++中使用。
(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。
(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。
(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。
关于区别更加详细的解释:
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
1、new 是c++中的操作符,malloc是c 中的一个函数
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
4、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的,而malloc返回的都是void指针。
5、new和malloc虽然都是申请内存,但申请的位置不同,new的内存从free store分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分),free store和heap很相似,都是动态内存,但是位置不同,这就是为什么new出来的内存不能通过free来释放的原因。不过微软编译器并没有很好的执行标准,很有可能把free store和heap混淆了,因此,free有时也可以。
6、delete时候不需要检查NULL,而free(NULL)那就麻烦大了。
new/delete的功能完全覆盖了malloc/free,C++不把malloc/free淘汰出局,是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
至于困扰的java为什么没有这个机制:
java内存动态分配?Java虚拟机的内存区域Java中对象内存的分配是在Java虚拟机中进行的。
也就是说你在java中直接new一个对象就可以了,不需要去释放。
虚拟机里有垃圾回收,垃圾回收分full gc 和普通gc,这些想了解详细可以去查查资料。
java其实帮你完成了这些繁琐的过程,加速你的开发过程。
java本身的机制就是动态的内存分配,不需要手工管理的,可以有效的防止内存溢出。