user-0 提问: 关于 free() 的参数问题

回复:
user: user-1
content: 引用 9 楼 test_lockxxx 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  赵老师，请问：  char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放pstr指向的内存吗？[/quote] 能

user: user-2
content: 4.10.3.2 The free function   Synopsis           #include <stdlib.h>          void free(void *ptr);  Description     The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation.  If ptr is a null pointer, no action occurs.  Otherwise, if the argument does not match a pointer earlier returned by the calloc , malloc , or realloc function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

user: user-3
content: // 由于 abc指针 进行了移动,  free(abc) 还能把上面申请的 16个字节的内存释放吗？ 还是释放 13 个字节？ 不是释放16个字节，也不是释放13个字节，因为free(abc)直接执行错误  为啥呢？ 可以起看看malloc的源码 是因为malloc申请内存传递一个大小的参数得到一个指针，此时已经记录了指针和大小，当你释放的时候，就会去找这个指针，而你移动了指针，所以就找不到就直接报错了

user: user-4
content: 引用 11 楼 my_live_123 的回复:[quote=引用 10 楼 sholber 的回复:] [quote=引用 7 楼 my_live_123 的回复:] 很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？[/quote] 这和malloc实现有关系，如果一个不错的实现，那么它返回的一定是“适当”对齐的，这个适当就必须满足各种数据对象.且还要满足操作系统的对齐要求。如果操作系统指定所有数据对象都是4字节或者8字节对齐，那么malloc返回的必须是这样对齐的地址，否则就是error！ 此外，有的malloc实现，分配的大小要大于等于你的参数。比如你给一个奇数参数，它不会正正好好就给你那么多！它会分配一个能满足你大小但是要大于你给定的大小的一段连续空间，一般都是某个数的倍数。[/quote]  这和OS没关系，和架构有关。 C的实现只需使用那个最严格的对齐要求即可。 俺让楼主给你满分。

user: user-5
content: 引用 10 楼 sholber 的回复:[quote=引用 7 楼 my_live_123 的回复:] 很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？[/quote] 这和malloc实现有关系，如果一个不错的实现，那么它返回的一定是“适当”对齐的，这个适当就必须满足各种数据对象.且还要满足操作系统的对齐要求。如果操作系统指定所有数据对象都是4字节或者8字节对齐，那么malloc返回的必须是这样对齐的地址，否则就是error！ 此外，有的malloc实现，分配的大小要大于等于你的参数。比如你给一个奇数参数，它不会正正好好就给你那么多！它会分配一个能满足你大小但是要大于你给定的大小的一段连续空间，一般都是某个数的倍数。

user: user-4
content: 引用 7 楼 my_live_123 的回复:很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值  来，自由讨论一哈： void * pv = malloc (100); long * pl = pv; long有自己的对齐要求，void和char一样可以对齐于任何字节地址。但是，C的实现是如何确保malloc分配的指针是按long的要求对齐的呢？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  赵老师，请问：  char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放pstr指向的内存吗？

user: user-5
content: 很显然，偏移3个后，释放的内存内存地址不是对齐的，会出错！ free配对malloc使用，即free的参数应该是malloc返回的地址值

user: user-6
content: 引用 2 楼 test_lockxxx 的回复:char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放内存吗？  不能, 没释放

user: user-1
content: free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  free <stdlib.h> and <malloc.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  memblock  Previously allocated memory block to be freed  Remarks  The free function deallocates a memory block (memblock) that was previously allocated by a call to calloc, malloc, or realloc. The number of freed bytes is equivalent to the number of bytes requested when the block was allocated (or reallocated, in the case of realloc). If memblock is NULL, the pointer is ignored and free immediately returns. Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.  After a memory block has been freed, _heapmin minimizes the amount of free memory on the heap by coalescing the unused regions and releasing them back to the operating system. Freed memory that is not released to the operating system is restored to the free pool and is available for allocation again.  When the application is linked with a debug version of the C run-time libraries, free resolves to _free_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* MALLOC.C: This program allocates memory with  * malloc, then frees the memory with free.  */  #include <stdlib.h>         /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h>  void main( void ) {    char *string;     /* Allocate space for a path name */    string = malloc( _MAX_PATH );    if( string == NULL )       printf( "Insufficient memory available\n" );    else    {       printf( "Memory space allocated for path name\n" );       free( string );       printf( "Memory freed\n" );    } }   Output  Memory space allocated for path name Memory freed   Memory Allocation Routines  See Also   _alloca, calloc, malloc, realloc, _free_dbg, _heapmin

user: user-7
content: 内存管理器一般是这么记录每个内存块的， （首地址，长度） （首地址，长度） （首地址，长度） （首地址，长度） （首地址，长度） 如果你没有给它传首地址，一般情况下它是认为你传的是个无效地址，不会有内存释放动作的。它在管理内存的时候，是按块管理的，不存在只删除一部分的情形。  参考 http://www.afanihao.cn/c_guide/  的第12章“动态内存分配”

user: user-8
content: 引用 2 楼 test_lockxxx 的回复:char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放内存吗？ 能

user: user-0
content: char *pstr = (char *)malloc(16);  char *abc = pstr;  free(abc);  //这样能正确的释放内存吗？

user: user-8
content: 这就是不对. 不能这么用