1
#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 -> b 将访问内存块出站。应该发生堆损坏!但实际上,调试和发布模式都没有发生任何事情。

但是由于 int c 紧跟在 A * pa 之后;我认为在内存中,pa -> b 将访问 int c。

程序的输出是:3 4 5

谁能帮忙解释一下?


如果我添加“免费(pa);” 在main的最后:+debug模式下,会导致HEAP CORRUPTION ERROR。+在释放模式下,仍然没有任何反应。

4

2 回答 2

1

未定义的行为意味着任何事情都可能发生。特别是,不需要诊断。

查找此类错误的一种实用方法是使用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 也有类似的工具:有没有很好的 Valgrind 替代 Windows?

于 2013-04-12T09:06:03.100 回答
0

只有当您输入一些堆函数时,才能检测到堆损坏。在这种情况下,您只在开始时输入堆函数,此时堆仍未损坏。pa在返回之前尝试删除指向的结构main,看看会发生什么。

于 2013-04-12T09:02:20.213 回答