C和C++中动态分配内存,区别

来源:互联网 发布:智能制造仿真软件 编辑:程序博客网 时间:2024/06/05 18:38

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本身的机制就是动态的内存分配,不需要手工管理的,可以有效的防止内存溢出。


原文链接:http://blog.csdn.net/ABC006250/article/details/7824547

0 0