2012-08-03 40 views
-2

可能重複:
C++ - Check if pointer is pointing to valid memory (Can't use NULL checks here)如何檢查是否指針是有效的無包裝與布爾

如何檢查是否指針是沒有連接到他的包裝或附加內存是否有效? 通過有效我的意思是我沒有刪除它,或者我可以達到它或它分配。

我正在使用VS \ Windows。

+3

沒有標準或可移植的方式來做到這一點。 – 2012-08-03 14:14:02

+0

你的問題假設的「有效」的定義是什麼? – 2012-08-03 14:14:32

+0

@ArmenTsirunyan我在那裏回答了這個問題。因爲這個功能應該是FAQ。 – MessyCode 2012-08-03 14:14:50

回答

-3

這有效入住的僅適用於Windows(VS)檢查,這裏的功能是:

#pragma once 
//ptrvalid.h 
__inline bool isValid(void* ptr) { 
    if (((uint)ptr)&7==7) 
     return false; 
    char _prefix; 
    __try { 
     _prefix=*(((char*)ptr)-1); 
    } __except (true) { 
     return false; 
    } 
    switch (_prefix) { 
    case 0: //Running release mode with debugger 
    case -128: //Running release mode without debugger 
    case -2: //Running debug mode with debugger 
    case -35: //Running debug mode without debugger 
     return false; 
     break; 
    } 
    return true; 
} 

用法:

#include <stdio.h> 
#include "ptrvalid.h" 

void PrintValid(void* ptr) { 
    if (isValid(ptr)) 
     printf("%d is valid.\n",ptr); 
    else 
     printf("%d is not valid.\n",ptr); 
} 

int main() { 
    int* my_array=(int*)malloc(4); 
    PrintValid(my_array); 
    PrintValid((void*)99); 
    free(my_array); 
    PrintValid(my_array); 
    my_array=new int[4]; 
    PrintValid(my_array); 
    delete my_array; 
    PrintValid(my_array); 
    getchar(); 
} 

輸出:

764776 is valid. 
99 is not valid. 
764776 is not valid. 
774648 is valid. 
774648 is not valid. 

功能的解釋:(什麼它確實)

在實際檢查之前檢查功能,如果地址有效\開始指向內存。 之後,他檢查這個過程是否可以達到這個內存的前綴(如果捕獲異常,如果不能),最後一次檢查是檢查這個內存的前綴是否在任何模式下被刪除。 (Debugging \ Without Debug Mode \ Release Mode) 如果函數通過了所有這些檢查,則返回true。

+0

現在如果我想使用[TCMalloc](http://gperftools.googlecode.com/svn/trunk/doc/tcmalloc.html):) – Joe 2012-08-03 14:15:26

+0

我測試了它在新的刪除和malloc免費,只在Windows上。我稍後會檢查tcmalloc。我從來沒有聽說過它。 – MessyCode 2012-08-03 14:18:12

+0

我只是提出一個觀點,即沒有這樣做的標準方法。這樣做依賴於分配器的實現細節,因此它將永遠不可移植。然而,看到如何在使用VS的窗口上執行它是很好的。 – Joe 2012-08-03 14:23:35

1

如果「你沒有刪除,或者這個內存被分配了,或者你可以訪問那個內存」,指針是有效的。所以我建議:

  1. 跟蹤您分配的內存。如果這個指針不在任何這些塊中,你就沒有分配它。

  2. 當您刪除指針或空閒內存時,將其從列表中刪除。這樣,你也可以檢查你沒有刪除它。

  3. 試着訪問它。如果您無法訪問它,則無效。

  4. 如果它通過了這些測試,它是有效的。

我不是在開玩笑。做到這一點的正確方法是精確定義「有效」的含義,並精確測試指針是否符合這些條件。

但是真的,這不僅僅是C++的完成方式。無論你的潛在問題是什麼,可能有更好的方法來做到這一點。

+0

檢查指針是否在列表中很重(我正在創建腳本語言),我提到我不希望額外的數據與指針(可以是並行列表等) – MessyCode 2012-08-03 14:23:21

+0

@MessyCode:如果檢查列表很重,優化它,例如,你可以使用Boost的[unordered_map ](http://www.boost.org/doc/libs/1_48_0/doc/html/boost/unordered_map.html)模板我不明白爲什麼你不需要額外的指針數據要求額外的數據(不管指針是否有效) – 2012-08-03 14:28:53

+0

我問了沒有額外的數據,但我認爲我沒問題,我回答了我的問題。 (搜索它可能在那裏) – MessyCode 2012-08-03 14:32:43