{
char *p;
p=(char*)malloc(100);
char *q;
q=p;
free(q);
}
在执行完free(q)后,p是不是变野指针了?malloc的原理是怎样的啊?
11 个解决方案
#1
free(q)是q指向指向的内容没了。在free(q)之前q指向一定的内存区,这个内存区为系统为当前程序分配的,而且系统知道这块内存已经分配了,它就不会再将它分配给别人了。free(q)只是告诉系统这块内存它不要了,所以系统就回收了,并且知道它是没有人使用的内存,在需要的时候就可以分配给别人。如果不free的话系统会一直认为是正在被使用中,直到退出当前程序,就会造成内存泄露。
最后还要注意把q值指向NULL,要不它会变成野指针的
最后还要注意把q值指向NULL,要不它会变成野指针的
#2
free(q)后,p变成了野指针,所以一般后面还要加上这么一句p=NULL;
至于malloc的原理可以看看MSDN,最好看看它的源代码
C/C++ function that allocates a block of memory from the heap.
The implementation of the C++ operator new is based on malloc.
malloc分配的结构大概分为header,payload,footer
至于malloc的原理可以看看MSDN,最好看看它的源代码
C/C++ function that allocates a block of memory from the heap.
The implementation of the C++ operator new is based on malloc.
malloc分配的结构大概分为header,payload,footer
#3
那就是执行完free(q)后p和q都是野指针了,对吗?
#4
malloc就是在堆上分配一块连续的内存快,供程序存储数据,当申请一块内存时,其他程序,变量就不能使用着个内存块了,释放后,其他程序,变量才可以用,
malloc调用低层,操作系统的分配内存的函数,先对着个区域,进行琐定,防止其他变量,程序用着快内存
free后,释放着个内存快,上面中free(q)是将q指向的内存释放掉,q现在的指向不明确,所以就成野指针了
malloc调用低层,操作系统的分配内存的函数,先对着个区域,进行琐定,防止其他变量,程序用着快内存
free后,释放着个内存快,上面中free(q)是将q指向的内存释放掉,q现在的指向不明确,所以就成野指针了
#5
LZ说得对
#6
又有人提这类问题!
2楼 ltaoscu的这个做法很有用哦!但是只能针对是auto类型的指针变量使用。
所以还是要强调一下:
1、要么只使用auto类型的指针变量接收这类地址值;
2、哪个函数使用malloc,那么free也由这个函数负责,最好在主调函数中malloc并把地址传给被调函数,使用完仍由主调函数负责free掉;
3、要么使用外部指针变量或者静态指针变量接收这类地址值,到哪里都可以用,不会乱,改变之前先free。
至于malloc的原理,你不需要了解,只要按照游戏规格做,除非你想做hacker!^_^
2楼 ltaoscu的这个做法很有用哦!但是只能针对是auto类型的指针变量使用。
所以还是要强调一下:
1、要么只使用auto类型的指针变量接收这类地址值;
2、哪个函数使用malloc,那么free也由这个函数负责,最好在主调函数中malloc并把地址传给被调函数,使用完仍由主调函数负责free掉;
3、要么使用外部指针变量或者静态指针变量接收这类地址值,到哪里都可以用,不会乱,改变之前先free。
至于malloc的原理,你不需要了解,只要按照游戏规格做,除非你想做hacker!^_^
#7
的确,这个问题很多人问了,呵呵.
#8
学习学习
#9
说的很好,这个 问题也困惑了我好久。
#10
free(q)之后,q指向的那段100字节的连续内存区域(在堆上分配)重获*,它的内容不再为P,q所控制,即p,q都成为野指针。malloc的原理就是动态分配内存空间,和free配对使用。
#11
up
#1
free(q)是q指向指向的内容没了。在free(q)之前q指向一定的内存区,这个内存区为系统为当前程序分配的,而且系统知道这块内存已经分配了,它就不会再将它分配给别人了。free(q)只是告诉系统这块内存它不要了,所以系统就回收了,并且知道它是没有人使用的内存,在需要的时候就可以分配给别人。如果不free的话系统会一直认为是正在被使用中,直到退出当前程序,就会造成内存泄露。
最后还要注意把q值指向NULL,要不它会变成野指针的
最后还要注意把q值指向NULL,要不它会变成野指针的
#2
free(q)后,p变成了野指针,所以一般后面还要加上这么一句p=NULL;
至于malloc的原理可以看看MSDN,最好看看它的源代码
C/C++ function that allocates a block of memory from the heap.
The implementation of the C++ operator new is based on malloc.
malloc分配的结构大概分为header,payload,footer
至于malloc的原理可以看看MSDN,最好看看它的源代码
C/C++ function that allocates a block of memory from the heap.
The implementation of the C++ operator new is based on malloc.
malloc分配的结构大概分为header,payload,footer
#3
那就是执行完free(q)后p和q都是野指针了,对吗?
#4
malloc就是在堆上分配一块连续的内存快,供程序存储数据,当申请一块内存时,其他程序,变量就不能使用着个内存块了,释放后,其他程序,变量才可以用,
malloc调用低层,操作系统的分配内存的函数,先对着个区域,进行琐定,防止其他变量,程序用着快内存
free后,释放着个内存快,上面中free(q)是将q指向的内存释放掉,q现在的指向不明确,所以就成野指针了
malloc调用低层,操作系统的分配内存的函数,先对着个区域,进行琐定,防止其他变量,程序用着快内存
free后,释放着个内存快,上面中free(q)是将q指向的内存释放掉,q现在的指向不明确,所以就成野指针了
#5
LZ说得对
#6
又有人提这类问题!
2楼 ltaoscu的这个做法很有用哦!但是只能针对是auto类型的指针变量使用。
所以还是要强调一下:
1、要么只使用auto类型的指针变量接收这类地址值;
2、哪个函数使用malloc,那么free也由这个函数负责,最好在主调函数中malloc并把地址传给被调函数,使用完仍由主调函数负责free掉;
3、要么使用外部指针变量或者静态指针变量接收这类地址值,到哪里都可以用,不会乱,改变之前先free。
至于malloc的原理,你不需要了解,只要按照游戏规格做,除非你想做hacker!^_^
2楼 ltaoscu的这个做法很有用哦!但是只能针对是auto类型的指针变量使用。
所以还是要强调一下:
1、要么只使用auto类型的指针变量接收这类地址值;
2、哪个函数使用malloc,那么free也由这个函数负责,最好在主调函数中malloc并把地址传给被调函数,使用完仍由主调函数负责free掉;
3、要么使用外部指针变量或者静态指针变量接收这类地址值,到哪里都可以用,不会乱,改变之前先free。
至于malloc的原理,你不需要了解,只要按照游戏规格做,除非你想做hacker!^_^
#7
的确,这个问题很多人问了,呵呵.
#8
学习学习
#9
说的很好,这个 问题也困惑了我好久。
#10
free(q)之后,q指向的那段100字节的连续内存区域(在堆上分配)重获*,它的内容不再为P,q所控制,即p,q都成为野指针。malloc的原理就是动态分配内存空间,和free配对使用。
#11
up