malloc和free详解

可能很多人会问为什么使用了free函数释放,但是在此调用指针,指针里面还是有内容?

好,小飞今天就总结一下!

malloc:

  1.malloc()函数的头文件是stdlib.h,其函数声明如下:

     void* malloc(size_t size);

     其中参数size_t size表示动态内存分配空间的大小,以字节为单位。

    size_t 是typedef重定义的类型,重定义这样数据类型的作用就是让使用者一目了然,指示使用者这个参数表示一个长度,在       size后      加上t,表示是整型相关数据类型的,以后看到xxx_t的类型,通常都是整型相关数据类型重定义。

    在这里malloc()函数的返回值是一个指针,或者说是分配后内存空间的首地址

    如果malloc()函数申请空间成功则返回一段内存空间的首地址,失败则返回NULL

2、int *p;

扫描二维码关注公众号,回复: 9832839 查看本文章

     p = malloc(sizeof(int));

     在这里是不能这样写的,会出现错误:从类型 'void*' 到类型‘int’的转换无效,应该改为:

       p =(int *) malloc(sizeof(int));

3、在使用malloc()函数申请的空间之前,最好用memset()函数把这段内存空间清理一下,因为用malloc()函数申请的空间仅仅保证的是内存空间的大小,并不保证内存空间是否有数据垃圾

4、当不在使用malloc()函数申请的空间之后,应该使用如下函数释放掉这个内存空间:

     void  free(void *ptr);

     其中void *ptr是malloc()函数的返回值,也就是内存空间的首地址

     如果只知道使用,而不知道释放,则在7天*24小时运行的嵌入式产品中,很容易会出现内存泄漏,最终导致系统瘫痪

样例代码:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int main()
{
    int  * ptr;
    ptr=(int *)malloc(sizeof(int));
    if(ptr==NULL)
       cout<<"false"<<endl;
    cout<<"please input a int"<<endl;
    cin>>*ptr;
    cout<<"the int is:"<<endl;
    cout<<*ptr<<endl;
    return 0;
}

// 输出
please input a int
520
the int is:
520
the int is:
520

Process returned 0 (0x0)   execution time : 3.301 s
Press any key to continue.

free:

看到上面的代码,小飞明明使用了free去释放ptr但是调用它后还是会输出520;这是为什么呢?,好下面就来解释一下。

free(pointer); 释放的是指针指向的内存。注意,释放的是内存,不是指针。指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容是垃圾,是未定义的。因此,释放内存后把指针指向 NULL,防止指针在后面不小心又被解引用了。

free函数仅仅是将malloc申请的内存释放回去,所谓的释放也就是告诉编译器,这块内存已经使用完毕,可以收回了。但指针所指向的内存值,并不会发生改变。就可以比方说,你租了一套房子,到期后,房子收回归还房东,而此时你可能还拿着房子的钥匙,这个时候你虽然可以继续访问这个房子(内存),但已经不属于你,是非法的。也可能有新的租客入驻更改房子的内置,也可能还是这个样子。取决于不同的房东(编译器)和租客(内容)。

关于free的函数的具体使用我就直接上链接了;

free函数的使用

 

发布了28 篇原创文章 · 获赞 58 · 访问量 3884

猜你喜欢

转载自blog.csdn.net/weixin_45882303/article/details/104619057