malloc和free(1)——malloc()申请内存得到指针,指针没有改变,用free()释放内存,不会报错
2017-12-06 12:14
666 查看
malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
free()功 能: 与malloc()函数配对使用,释放malloc函数申请的动态内存。(另:对于free(p)这句语句,如果p 是NULL指针,那么free
对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。)
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,可能还存储着原来的数据,但是那些数据对现在已经没有用了,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。
输出:
报错:double free or corruption (fasttop): 0x0000000000d1b1f0 ***
原因是多次调用free(p),并且p不是NULL
![](https://img-blog.csdn.net/20171206121718497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemxmMTk5MTA3MjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
参考: https://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html
free()功 能: 与malloc()函数配对使用,释放malloc函数申请的动态内存。(另:对于free(p)这句语句,如果p 是NULL指针,那么free
对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。)
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,可能还存储着原来的数据,但是那些数据对现在已经没有用了,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。
#include <type 4000 info> #include<stdlib.h> //malloc()头文件 #include<iostream> using namespace std; //数组指针 int main() { cout<<"Hello main()"<<endl; int len = 10; //声明时候赋值NULL double *Parr1D1 = NULL; cout<<"Parr1D1 pointer address Before malloc: "<<Parr1D1<<endl; //Parr1D1的值是一个指针,顺着这个指针可以从内存中找到数据 Parr1D1 = (double*)malloc(len*sizeof(double));//从此指针知道自己所指向的内存的地址 cout<<"Parr1D1 pointer address After malloc: "<<Parr1D1<<endl; //Parr1D1的值是一个指针,顺着这个指针可以从内存中找到数据 cout<<"Parr1D1[i] Before ( free(Parr1D1); ): "; for(int i=0; i<len; i++) { Parr1D1[i] = i; cout<<Parr1D1[i]<<" "; } cout<<endl<<endl; ///////////////////////////////////////////////////////////////////////////////// // free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。 ///////////////////////////////////////////////////////////////////////////////// delete(Parr1D1); //或者 free(Parr1D1); cout<<"Parr1D1 pointer address After ( free(Parr1D1); ): "<<Parr1D1<<endl; //Parr1D1的值是一个指针,顺着这个指针可以从内存中找到数据 cout<<"Parr1D1[i] After ( free(Parr1D1); ): "; for(int i=0; i<len; i++) { cout<<Parr1D1[i]<<" "; } cout<<endl; //释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。 Parr1D1 = NULL; /* * //执行Parr1D1 = NULL;后,下面这段程序如果执行,就会卡在这里,因为此时Parr1D1是没有指向的 for(int i=0; i<len; i++) { cout<<Parr1D1[i]<<" "; } cout<<endl; * */ //报错:double free or corruption (fasttop): 0x0000000000d1b1f0 *** //如果注释掉 Parr1D1 = (double*)malloc(len*sizeof(double)); 或者执行 Parr1D1 = NULL; 则不会报错 //因为如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。 //free(Parr1D1); //double free or corruption (fasttop): 0x0000000000d1b1f0 *** cout<<"Goodbye main()"<<endl;; return 0; }
输出:
Hello main() Parr1D1 pointer address Before malloc: 0 Parr1D1 pointer address After malloc: 0x1b061f0 Parr1D1[i] Before ( free(Parr1D1); ): 0 1 2 3 4 5 6 7 8 9 Parr1D1 pointer address After ( free(Parr1D1); ): 0x1b061f0 Parr1D1[i] After ( free(Parr1D1); ): 0 1 2 3 4 5 6 7 8 9 Goodbye main()
报错:double free or corruption (fasttop): 0x0000000000d1b1f0 ***
原因是多次调用free(p),并且p不是NULL
参考: https://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html
相关文章推荐
- malloc和free(3)——malloc()申请内存得到指针,通过memcpy()拷贝数据到指针所指内存,指针没有改变,调用free()释放内存不会报错
- malloc和free(2)——malloc()申请内存得到指针,指针被改动,用free释放内存报错
- c语言之内存的申请malloc() 和释放free()
- c语言多级指针用malloc申请内存,释放报错,为什么会这样捏???????
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- 有关于malloc申请内存和free内存释放
- malloc,free动态申请释放内存机制
- C 笔记 free()释放一个非malloc() 申请的内存
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- 在C++动态库中释放调用动态库程序中生成的指针new和delete 或 malloc和free
- C++中new申请的内存, 可以用free释放吗?
- C语言指针,申请、释放内存,线程
- c中内存分配与释放(malloc,realloc,calloc,free)函数内容的整理
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- 内存出错有时候是free后没有给指针赋NULL
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- 费解,为什么申请的内存没有被释放?约瑟夫环
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)