百科问答小站 logo
百科问答小站 font logo



C语言和C++中,为什么malloc函数需要传入申请的内存大小,而free时候却不需要传大小呢? 第1页

  

user avatar   a-ha-2-2 网友的相关建议: 
      

C语言标准就是这么规定的:free无需手动指示大小。不是怕你不小心填错,而是事实上你很难填对。

这是因为,虽然你告诉了malloc你要多少空间,但malloc真正分配了多少只有它自己知道。例如,你向malloc要了999字节,但某人写的malloc分配的最小粒度是1024字节,那么你会得到一个1024字节的空间(虽然你一直以为它是999字节而不敢越雷池一步,这倒也没什么)。

所以,要是你填一个错误值,还得让它费心修正,还不如就让它自己管理。

最常见的解决方案是,在malloc时,所分配的不仅是你请求的那点空间,还加了一个信息块来记录额外信息,这个信息块位于你请求的空间前面。而malloc返回指针的指向的是你请求的空间,如果你想看看那个信息块的话,把malloc返回的指针往前走几步就能看到了。

free所需的信息可以直接在信息块中取。信息块和空间都会被释放。

具体信息块有多大?它记录的是字节的多少?还是块的数量?还记录了啥?这都是依具体实现而定,并不统一。

显然,以C语言的特点,这样位置的信息块并不保险。如果你的指针越界写入,破坏了其中的信息,这样错误会在free时候爆发。

还有,上面“在空间之前加信息块”的解决方案虽然是最常见的方案,但并不是所有C标准库都会采用这个方案。只要能实现“free无需手动指示大小”这个要求,所有其他方案都可以。比如把信息块放在空间后面,或者远离空间另一个位置。




  

相关话题

  C 与 C++ 的真正区别在哪里? 
  共用体只能同时储存一个值吗? 
  C语言中整型输出(%d)有什么用? 
  真心觉得C语言链表很抽象 难学 该如何学习? 
  同样用pow()表示10^2,为什么分别用字面量和变量作参数会返回不同的值? 
  对于C++ 开发者来说,服务器端开发,游戏开发, 嵌入式软件开发,哪个方向更有前景? 
  为什么学习编程第一课要学习输出"hello, world"?这是谁规定的? 
  多核CPU中,利用多线程进行排序中出现了一些奇怪的现象,不知道其背后的原因是什么,希望有人能给予解答? 
  既然引用计数在做 GC 时有性能问题,为什么智能指针会广泛应用它? 
  C++ 类当中为什么要有private? 

前一个讨论
如何看待这么多华语流行歌翻唱于日语歌?
下一个讨论
「用进废退」是不是完全错误的学说?





© 2025-03-03 - tinynew.org. All Rights Reserved.
© 2025-03-03 - tinynew.org. 保留所有权利