簡體   English   中英

為什么此代碼(malloc)不會產生堆損壞?

[英]Why does this code (malloc) not generate heap corruption?

#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

有人可以幫忙解釋一下嗎?


如果我添加“ free(pa);” 在main的末尾:+在調試模式下,它將導致HEAP CORRUPTION ERROR。 +在釋放模式下,什么也沒有發生。

未定義的行為意味着任何事情都可能發生。 特別地,不需要診斷。

查找此類錯誤的一種實用方法是使用類似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有類似的工具:Windows 是否可以用Valgrind替代?

僅當您輸入某些堆功能時才能檢測到堆損壞。 在這種情況下,僅在堆尚未損壞時才在開始時輸入堆函數。 main返回之前,嘗試刪除指向pa結構,然后看看會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM