重複の可能性:
C++ - ポインターが有効なメモリを指しているかどうかを確認します (ここでは NULL チェックを使用できません)。
ラッパーまたは追加のメモリが接続されていない状態でポインターが有効かどうかを確認するにはどうすればよいですか? 有効とは、削除していないか、アクセスできるか、割り当てられていることを意味します。
VS\Windows を使用しています。
重複の可能性:
C++ - ポインターが有効なメモリを指しているかどうかを確認します (ここでは NULL チェックを使用できません)。
ラッパーまたは追加のメモリが接続されていない状態でポインターが有効かどうかを確認するにはどうすればよいですか? 有効とは、削除していないか、アクセスできるか、割り当てられていることを意味します。
VS\Windows を使用しています。
「それを削除しなかったか、このメモリが割り当てられているか、またはそのメモリにアクセスできる」場合、ポインタは有効です。だから私は提案します:
割り当てたメモリを追跡します。このポインタがこれらのブロックのいずれにもない場合は、割り当てていません。
ポインタを削除したり、メモリを解放したりするときは、リストから削除してください。そうすれば、削除していないことを確認することもできます。
アクセスしてみてください。アクセスできない場合は無効です。
これらのテストに合格した場合、それは有効です。
冗談じゃない。これを行う正しい方法は、「有効」の意味を正確に定義し、ポインターがこれらの条件を満たしているかどうかを正確にテストすることです。
しかし実際には、これはC++の実行方法ではありません。根本的な問題が何であれ、おそらくそれを行うためのより良い方法があります。
この有効なチェックは、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 を返します。