c语言free函数和c++new及delete总结

c语言free释放内存详细说明
    1. free只能释放动态分配的内存空间(堆空间)。由(malloc,calloc,realloc)等函数
分配。
    例:int b=10;
int* i = &b;
free(i);//段错误,不能释放栈空间内存
    2. 使用free释放堆内存空间时,其内部会判断该指针是否有效,然后判断指向的内
存是否是一整块动态分配内存(malloc,calloc,realloc)。
    例1:char *s = (char*)malloc(1000);
char *s1 = s+100;
free(s1); //错误,s1并不是指向一整块动态分配的堆空间,s1只是指向动态分配内存的一部分。
s1 = s;
free(s1);//正确,现在s1指向的就是一整块动态分配的堆空间。
    例2:
char* s = (char*)malloc(1000);
char* s1=s;
strcpy(s,"abcdefg");
char* s2 = strtok(s,"c");
s2 = strtok(NULL,"c");
free(s2); //错误,和例1一样,s2指向的只是一部分动态分配的内存空间
s2 = s;
free(s2); //正确。

c++ new和delete运算符说明

class A

{};

A* a = new A();//表示申请一个存放A类对象的内存空间,并调用构造函数A()初始化对象。

A* a1 = new A[10];//表示申请10个存放A类对象的内存空间,并为每个对象调用默认构造函数初始化。

delete a;//表示释放a指针所指向对象的内存空间,并调用a指针所指对象的析构。

delete[] a1;//表示释放a1指针所指向的内存空间,并为每个对象调用析构函数。

注意:1)delete释放由new申请的内存空间,虽然可以释放由new[]申请的内存空间,但是会导致除首地址对象外其他对象不调用析构,出现内存泄漏。delete也能释放由malloc申请的内存空间,只是会调用对象的析构函数。同样free虽然也能释放由new申请的内存空间,但是他不会调用对象的析构,因此会导致内存泄漏。(建议大家不要混着用)

           2)delete[]只能释放由new[]申请的内存空间,不能释放new和malloc申请的内存空间。free不能释放由new[]申请的内存空间,这样会导致程序崩溃(释放无效指针)

          3)delete和free释放内存空间时,都会先判断这块内存是否有效,然后检测这块内存是否是一整块动态分配的内存,在c/c++里,不允许只释放申请内存里的一部分内存,只能释放申请的一整块完整的内存空间。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值