此处扔出一个异常,但并不是因为这片区域被连续释放了两次。众所周知,如果你在释放掉一片区域后给它赋值为nullptr,那么你的第二次释放会被直接无视掉,不论你用的是new/delete还是malloc/free. 更何况此处的dtor自身还带了判断是否为nullptr的检查,所以更是只会释放一次。想要验证可以直接吧printf()放到if语句之内,就会发现其实这个判断只进了一次。
那么此处为什么会报错呢?通过代码复现可以发现console中给了错误信息:Invalid address specified to RtlValidateHeap(......).
这个信息会报出,原因是free检测到,malloc的地址与你试图释放的地址不相等。这是因为,bitmap1.data并没做深拷贝,所以它的指针不是malloc得来的(只是强行被赋值成了与bitmap.data相同的地址),因此自然会被free检测到。