#include <iostream>
using namespace std;
struct A
{
int a, b;
};
struct B
{
int a;
};
int main()
{
A * pa = (A *)malloc(sizeof(B));
int c = 5;
pa -> a = 3;
cout << pa -> a << endl;
pa -> b = 0;
cout << pa -> b << endl;
cout << c << endl;
return 0;
}
我使用VC ++ 2012运行此代码。它不会生成任何错误消息。
我认为pa - &gt; b将访问内存块出站。应该发生堆腐败! 但实际上,在调试和释放模式下都没有发生任何事情。
但是因为int c紧跟A * pa; 我想在记忆中,pa - &gt; b将访问int c。
该计划的输出是: 3 4 5
有人可以帮忙解释一下吗?
如果我添加“free(pa);”在主要结束时: +在调试模式下,它将导致HEAP CORRUPTION ERROR。 +在发布模式下,没有任何事情发生。
答案 0 :(得分:1)
Undefined behaviour表示任何事情都可能发生。特别是,不需要诊断。
查找此类错误的一种实用方法是使用Valgrind之类的工具:
$ valgrind ./a.out
a=3
==37240== Invalid write of size 4
==37240== at 0x100000E1D: main (test.c:22)
==37240== Address 0x10001b184 is 0 bytes after a block of size 4 alloc'd
==37240== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==37240== by 0x100000DD2: main (test.c:19)
==37240==
==37240== Invalid read of size 4
==37240== at 0x100000E28: main (test.c:23)
==37240== Address 0x10001b184 is 0 bytes after a block of size 4 alloc'd
==37240== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==37240== by 0x100000DD2: main (test.c:19)
==37240==
Windows有类似的工具:Is there a good Valgrind substitute for Windows?
答案 1 :(得分:0)
只有在输入一些堆函数时才能检测到堆损坏。在这种情况下,只有在堆仍未损坏的情况下,才在开头输入堆函数。在从pa
返回之前,尝试删除指向main
的结构,看看会发生什么。