内存管理问题

void genFNH(){
    int fnh=0;
    free(&fnh);
    }
void genFUM1(){
    int *fum=(int *)malloc(4*sizeof(int));
    free(fum+1);
    }

这两个函数的写法存在什么问题,主要从内存的角度考虑。

阅读 2.4k
3 个回答
新手上路,请多包涵

第一个释放了栈上的内存,错误;
第二个释放释放内存地址错误。

malloc(n)对外分配大小为n字节虚拟内存,返回其首指针。然malloc内部实际分配x+n字节,多余x字节位于n字节之前,其内数据记录该块内存的大小。x为常数,依赖于实现。
free(p)时,据p指针向前x字节,解析可得该内存大小等信息,free据此信息释放内存。

题主代码,未调用malloc而调用free。free(&fnh)强行将fnh地址传入。据常见内存结构,此地址之前x字节为栈数据,保存函数参数、返回地址等信息,free解析此x字节内存,将造成自fnh地址开始的若干字节内存释放,具体释放大小依赖于fnh地址之前x字节信息。通常此操作引起段错误,因fnh之后若干字节或未分配物理内存,或无权访问。

free(fum+1);与上同理,仅传入的指针不同。

free()只能释放由malloc(), calloc(), aligned_alloc(), (since C11)或realloc()分配的内存空间。

如果传递给free()的参数不是malloc(), calloc(), aligned_alloc()(since C11)realloc()的返回值,那么结果是UB。

free.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题