new/delete,new[]/delete[],malloc,free

来源:互联网 发布:vision是什么软件 编辑:程序博客网 时间:2024/06/05 19:07

1>malloc/free函数:(c语言实现动态内存分配)

原型:extern void *malloc(unsigned int num_bytes);分配成功返回被分配内存的指针,失败返回空指针NULL
           使用malloc后应用free释放(以防内存泄漏),并将这个指针指向的内容置空(NULL)防止以后不小心访问该空间

注:free释放的是内存,不是指针。

2>new/delete操作符:(c++实现动态内存分配)

new 做了两件事:1. 调用operator new分配空间。2. 调用构造函数初始化对象。(失败后会抛出bad_alloc异常)
delete 也做了两件事:1. 调用析构函数清理对象 。2. 调用operator delete释放空间
new[N]  1. 调用operator new分配空间。2. 调用N次构造函数分别初始化每个对象。
delete[]  1.调用N次析构函数清理对象。2. 调用operator delete释放空间

注:malloc/free,new/delete,new[]/delete[],要成对使用,否则可能会出现内存泄漏的问题


3>operator new,operator delete

1) operator new/operator delete operator new[]/operator delete[] 和malloc/free用法一样。
2)他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象。
3)实际operator new和operator delete只是malloc和free的一层封装。

4>区别和联系

1)它们都是动态管理内存的入口。

2)malloc必须由我们自己计算字节数,返回 强转的实际类型的指针

      new可以自己计算空间大小,并返回对象类型的指针(类型与对象匹配)

void test(){int* a = new int;//开辟一块大小为sizeof(int)的空间int* b = new int(3);//开辟一块大小为sizeof(int)的空间,并初始化为3int* c = new int[3];//开辟一块大小为sizeof(int)*3的空间delete a;delete b;delete[] c;}


3) malloc/free是C/C++标准库的函数,new/delete是C++操作符。

4) malloc/free只是动态分配内存空间/释放空间,new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。

5)若分配内存不够

malloc可使用realloc函数进行内存重新分配(realloc先预判当前指针所指向的内存是否有足够大的空间,如果没有,则按照新制定的大小来开辟一段空间,并将原来的值拷贝到新的内存,然后释放掉原来的空间)

new则没有这样的操作

6)申请失败返回值

     new失败后会抛出bad_alloc异常,malloc 失败返回空指针NULL