Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获得;检测到堆损坏:在正常块之后;释放内存时_C++ - Fatal编程技术网

C++ 获得;检测到堆损坏:在正常块之后;释放内存时

C++ 获得;检测到堆损坏:在正常块之后;释放内存时,c++,C++,我只想通过以下代码测试内存分配和删除: char* t = new char[20](); char* t2 = t + 22; *t2 = 0x01; printf("I am here\n"); delete[] t; 首先,在“char*t2=t+22”处,我知道我可能正在访问一个无效的内存插槽。然而,只是为了测试,我仍然这样做。在许多幸运的情况下,我在“*t2=0x01;”处没有错误。但是“delete[]t;”总是引发“检测到堆损坏:在正常块(#56)之后”错误。为什么呢 注意:我关

我只想通过以下代码测试内存分配和删除:

char* t = new char[20]();
char* t2 = t + 22;
*t2 = 0x01;
printf("I am here\n");
delete[] t;
首先,在“char*t2=t+22”处,我知道我可能正在访问一个无效的内存插槽。然而,只是为了测试,我仍然这样做。在许多幸运的情况下,我在“*t2=0x01;”处没有错误。但是“delete[]t;”总是引发“检测到堆损坏:在正常块(#56)之后”错误。为什么呢


注意:我关心的是为什么它不在“*t2=0x01;”之后立即引发异常?为什么要等到“delete[]t;”?

未定义的行为是未定义的-任何事情都可能发生


在本例中,最有可能发生的具体情况是堆管理器过度分配了您的
t
,并将sentinel字节放在分配的内存之后。当您释放内存时,它会检查那些sentinel字节,当它们更改时,它会标记堆损坏。

未定义的行为是未定义的-任何事情都可能发生


在本例中,最有可能发生的具体情况是堆管理器过度分配了您的
t
,并将sentinel字节放在分配的内存之后。当您释放内存时,它会检查那些前哨字节,因为它们已更改,它会标记堆损坏。

因为您损坏了堆。这就像在问:“我闯红灯,撞到了另一辆车。为什么我撞到了车?”@OldProgrammer,但为什么它在*t=0x01之后没有立即引发异常?因为你破坏了堆。这就像在问:“我闯红灯撞到了另一辆车。为什么我撞到了车?”@OldProgrammer但为什么它在*t=0x01之后不立即引发异常?我关心的是为什么它在“*t2=0x01;”之后不立即引发异常?为什么要等到“delete[]t;”?@duong_dajgja,因为此时内存管理器的代码都没有运行?它也不会经常检查整个堆中的问题,因为这样做效率很低?为什么要等到“delete[]t;”?@duong_dajgja,因为此时内存管理器的代码都没有运行?它也不会不断地检查整个堆中的问题,因为这样会非常低效。