簡體   English   中英

檢查是否在內存中分配了某個地址

[英]Checking if a certain adress in memory is allocated

我有一個函數,該函數接收一個指向100個整數的動態數組的指針。 但是在此之前,由malloc或calloc分配的不是100,而是50。

有沒有一種方法可以檢查是否分配了任何元素(例如第79位),而不用懷疑SIGSEGV的實際含義?

我的問題純粹是理論上的,我沒有實際的代碼可顯示。

不,指針不存儲其大小。 您最好將大小和指針存儲在結構中,然后傳遞給它:

typedef struct
{
    size_t size;
    int *ptr;
}  my_data;
void myFunc(my_data *data)
{
    size_t i;
    for(i = 0; i < data->size; i++)
    {
        // data->ptr[i];
    }
}
void myFunc2(my_data *data, size_t index)
{
    if(index < data->size)
    {
        // memory location exists
    }
}

不,沒有可移植且可靠的方法可以從代碼中進行檢查。

存在諸如valgrind工具,可以幫助診斷某些類型的內存錯誤。

不,沒有。

這是您使用動態分析工具(例如valgrind )或使用保留有關其大小信息的真實容器時的情況。

幾年前,我使用了一個圖書館,但忘記了它的名字。 使用它,您可以創建try-catch塊,並嘗試訪問try-block中的未知數據,例如x [79],並且,如果未在其中分配內存,則會生成異常。

好吧,您可以根據您的描述執行此操作,給定一個數組並尋找一個索引(與“任何原始指針”略有不同)。 通過更多的工作,甚至可以對任何指針執行此操作。

malloc函數必須存儲有關分配了多少的信息。 不幸的是,沒有標准必須做到這一點。 一些編譯器過度分配並在分配的數據之前存儲大小。 其他人可能將地址存儲在地圖中,但其他人可能會做其他事情,您不知道。

但是,我知道的大多數(全部?)C庫和至少一個鏈接程序都明確支持重載/掛鈎/替換分配功能。
例如,在GNU C庫中,可以設置__malloc_hook GNU ld允許您使用__wrap_malloc在鏈接器級別執行此類__wrap_malloc

因此,您可以使用簡單地調用真正的malloc函數並存儲信息的功能來重載/掛接mallocfree ,然后將信息分配給您自己在某個地方分配了多少(例如,通過過度分配和使用第一個單詞,或任何您喜歡的東西)。

然后編寫一個帶有基本指針和索引的函數。 該函數查看分配信息(現在您知道在哪里找到它了!),並且可以輕松檢查索引是否在范圍內。 這不適用於“僅任何指針”。

一種適用於“幾乎任何指針”的替代解決方案是編寫一個滿足不同領域分配的分配器,而不是簡單地包裝實際的malloc 來自同一領域的所有分配具有相同的分配大小。 給定任何指針,您只需要遍歷所有競技場並查看該地址是否在競技場的起始地址和結束地址內。

但是,通常應該非常確定已分配了多少資源,這不應該是猜測,也不是偶然的運氣,也不是在運行時需要弄清楚的東西。
另外,考慮到現成的內存調試器的存在,我懷疑是否值得花時間在應用程序側做這樣的事情。 只需使用valgrind之類的東西,根本不需要編寫任何代碼。

暫無
暫無

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

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