1、malloc 函数
void *malloc(unsigned int size);
在内存的动态存储区中分配一个长度为size的连续空间
成功返回所申请空间的起始地址
失败返回NULL
常使用sizeof()运算符判断所需要空间大小
2、free 函数
`void free(void *p)`;
释放指针 p 所指向的动态空间的地址。
p 是调用 malloc 函数时的返回的地址。
free函数无返回值。
3,、new “函数”
不
new和delete是运算符,不是函数,因此执行效率高。
使用形式:
指针变量 = new类型(常量);
指针变量 = new类型[表达式];
作用:
从堆分配一块“类型”大小的存储空间,
返回首地址。
其中:常量是初始化值,可省略。
创建数组对象时,不能为对象指定初始值。
如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL
4、delete 运算符
使用形式:
delete 指针变量;
delete []指针变量;
注意:
正常情况new一个数组之后,用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作(读操作不会)将会导致delete时出现段错误,无法进行删除。
比如
char* strcpy(char* dest, char* src);
这个函数是从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回dest的指针。如果dest指向的内存没有足够大小去存放src字符串 strcpy函数没有越界检测机制,他依然会继续越界写入。将会导致错误。
5、malloc与new区别
1、new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配;
2、new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。
3、new不仅分配一段内存,而且会调用构造函数,malloc不会。
4、new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会。
5、new是一个操作符可以重载,malloc是一个库函数。
6、malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作。
7、new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。
8、申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n。