我在某处读到,使用它是灾难性的free
删除不是通过调用创建的对象malloc
, 这是真的?为什么?
这是未定义的行为 - 永远不要尝试它。
让我们看看当您尝试时会发生什么free()
自动变量。堆管理器必须推断出如何获取内存块的所有权。为此,它要么必须使用一些单独的结构来列出所有已分配的块,但速度非常慢且很少使用,要么希望必要的数据位于块的开头附近。
后者经常使用,这就是我应该如何工作。当您调用 malloc() 时,堆管理器会分配一个稍大的块,在开头存储服务数据并返回一个偏移指针。有点像:
void* malloc( size_t size )
{
void* block = tryAlloc( size + sizeof( size_t) );
if( block == 0 ) {
return 0;
}
// the following is for illustration, more service data is usually written
*((size_t*)block) = size;
return (size_t*)block + 1;
}
then free()
将尝试通过偏移传递的指针来访问该数据,但如果指针指向自动变量,则任何数据都将位于它期望找到服务数据的位置。因此未定义的行为。很多时候服务数据被修改free()
让堆管理器获得该块的所有权 - 因此,如果传递的指针指向自动变量,则某些不相关的内存将被修改和读取。
实现可能会有所不同,但您永远不应该做出任何特定的假设。只打电话free()
在返回的地址上malloc()
家庭职能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)