我只想通过以下代码测试内存分配和删除:
interface xyz{
int a=1;
}
class Test2 implements xyz{
public static int a=123;
}
class Test1{
public static void main(String aa[]){
System.out.println(Test2.a);
}
}
首先,在" char * t2 = t + 22;"我知道我可能正在访问无效的内存插槽。但是,仅仅为了测试,我仍然这样做。在许多幸运的情况下,我在" * t2 = 0x01;"没有错误。但是"删除[] t;"总是提高" HEAP CORRUPTION DETECTED:正常阻止后(#56)"错误。那是为什么?
注意:我担心的是,为什么它不会在" * t2 = 0x01后出现异常;"?为什么必须等到"删除[] t;"?
答案 0 :(得分:0)
未定义的未定义行为 - 任何事情都可能发生。
在这种情况下,最有可能发生的具体事情是堆管理器过度分配了您t
并在分配的内存之后放置了sentinel字节。当你释放内存时,它检查了那些sentinel字节,因为它们已经改变了它标记的堆损坏。