malloc和new的区别

来源:互联网 发布:拳皇13steam出招优化 编辑:程序博客网 时间:2024/05/16 02:50
Malloc:
Malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C++规定,void* 类型可以强制转换为任何其它类型的指针.

原型:extern void *malloc(unsigned int num_bytes);
头文件:malloc.h或者stdlib.h、cstdlib。
功能:分配长度为num_bytes字节的内存块,一般会用到sizeof
返回值:分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定,一般会用到指针强制转换),否则返回空指针NULL。
注意:一定要和free()结合使用。例如free(p);

new:
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

int *p=new int;
int *p=new int [10]; //动态数组的大小可以是变量或常量;而一般直接声明数组时,数组大小必须是常量
int *p1;
p1=new int(12);  //分别表示动态分配了用于存放整型数据的内存空间,将初值12写入该内存空间,并将首地址值返回指针p1;
注意:括号相当于赋初值,如果括号里面为空,那就赋初值为空

动态分配二维数组:
int **p=new int* [row]; //row是二维数组的行,p是指向一个指针数组的指针
for(int i=0; i<row; i++)
p[i]=new int [col]; //col是二维数组的列,p是指向一个int数组的指针
删除这个二维数组:
for(int i = 0; i < row;i++)
delete []p[i]; //先删除二维数组的列
delete []p;

注意一:定义指针并不代表着就申请了内存,指针定义之后最好紧接着就申请内存,否则可能会出现段错误
注意二:delete指针实际上是让编译器释放内存,但指针本身依然存在,这时他就是一个迷途指针(或叫悬浮指针)迷途指针要置空为NULL,或者最好别使用,使用后可能会造成意想不到的错误!!

总之:
new 是个操作符,和什么"+","-","="...有一样的地位.
malloc是个分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.
malloc需要头文件库函数支持.
new 建立的是一个对象,
malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
-------------------------------------------------------------------------------------------------------
关于new的一个资源泄露的例子:
char *p2=new char;
 p2="adfad";
 cout<<p2<<endl;     //这里会输出字符串p:adfad,而不是地址
 cout<<*p2<<endl;   //这里会输出*p2:a,字符串第一个字符
 //delete p2;                //如果delete,会段错误报错,资源泄露

a只是个指针而以,它可以指向一个字符,也可以指向一个字符串。在第5行的时候,a指向的是一个一字节的char,但是在第6行的时候,a已经指向"abcde"了。所以输出的时候,就是"abcde"了。所以这个例子是一个典行的资源泄露的例子。因为new char了,确没有使用,并由于a在之后已经不指向这个字符的空间,使之以后都没有机会再被释放掉了,所以这1bit空间就资源泄露了。



原创粉丝点击