请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

指出视频中的一个错误的解释

此处扔出一个异常,但并不是因为这片区域被连续释放了两次。众所周知,如果你在释放掉一片区域后给它赋值为nullptr,那么你的第二次释放会被直接无视掉,不论你用的是new/delete还是malloc/free. 更何况此处的dtor自身还带了判断是否为nullptr的检查,所以更是只会释放一次。想要验证可以直接吧printf()放到if语句之内,就会发现其实这个判断只进了一次。

那么此处为什么会报错呢?通过代码复现可以发现console中给了错误信息:Invalid address specified to RtlValidateHeap(......).

这个信息会报出,原因是free检测到,malloc的地址与你试图释放的地址不相等。这是因为,bitmap1.data并没做深拷贝,所以它的指针不是malloc得来的(只是强行被赋值成了与bitmap.data相同的地址),因此自然会被free检测到。

正在回答

1回答

Redknot 2023-06-20 12:38:15

首先,你说的 free nullptr 指针是会被忽略的是没有问题的。

但是这个 crash 造成的原因不就是指针被拷贝,造成两个指针指向了同一片内存,然后 free 了两次造成的么?

1 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕仔4500275 #1
    本质来说确实是。就是想抠的细一点,主要是怕面试的时候会被提问23333。
    回复 有任何疑惑可以回复我~ 2023-06-20 15:31:22
  • 慕妹3585395 回复 提问者 weixin_慕仔4500275 #2
    回复 weixin_慕仔4500275:老师说的是对的,就是data地址已经被释放掉了,内存管理模块将其内存已标记为未分配,再次去释放时查表发现重复释放所以报错。 
    
    至于你所说的“原因是free检测到,malloc的地址与你试图释放的地址不相等”,这个说法没什么依据。你认为每次malloc之后的地址都被free函数记录下来了?free只是一个C函数,没有上下文之说,并不会检测是否和malloc匹配。
    回复 有任何疑惑可以回复我~ 2024-05-03 17:34:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信