delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
free 与 delete1. delete 用于释放 new 分配的空间,free 用于释放 malloc 分配的空间2. delete [] 用于释放 new [] 分配的空间3. delete 释放空间的时候会调用 相应对象的析构函数顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放举个例子,
1 #include <stdio.h>
2 #include <new>
3 #include <iostream>
4 #include <stdlib.h>
5 #include <string.h>
6
7 int main()
8 {
9 int *p = NULL,*p1=NULL;
10 int i;
11 //p = (int *) malloc(10 * sizeof(int));
12 p = new int[10];
13
14 memset(p,0,sizeof(int) * 10);
15 for(i=0;i<10;i++)
16 printf("P:%dt",p[i]);
17 printf("addr p: %xn",p);
18
19 *(p-1) = 2; //如果不注释掉这一行则程序运行不正确
20 *(p+11) = 3;
21 printf("addr before p: %xn",p+11);
22 printf("%x %xn",*(p-1),*(p+11));
23
24 //free(p);
25 delete [] p;
26 printf("free successfully! n");
27 return 0;
28 }
当注释了*(p-1) = 2之后运行结果为:
当不注释*(p-1) =2 这一行时,结果为:
Ref:http://www.cnblogs.com/hello--the-world/archive/2012/08/15/2639835.html原文链接: https://www.cnblogs.com/shed/archive/2012/10/30/2747202.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/67600
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!