2017-06-26 24 views
0

私はMFC/AFXの代わりにstd-functionを使用して、プラットフォームに依存しない環境でプロットされるMFCプロジェクトを使用していました。"AfxIsValidAddress"関数の同等の標準機能は何ですか?

例:代わりにCString std :: string、代わりにCMutex std :: mutexが使用されます。

MFC関数 "AfxIsValidAddress"に相当する、プラットフォームに依存しないC++ 11 std :: - とは何ですか?

+0

標準のC++では、 'AfxIsValidAddress'に相当するものはありません。とにかくそれはなぜ必要なのですか?どのような問題が解決するはずですか?非デバッグビルドでは、単純なヌルポインタチェックです。 –

+0

実装をチェックすると、この機能の中で一度に多くのチェックが表示されます。それらはデバッグ以外のビルドではすべて非アクティブですか? –

+1

'AfxIsValidAddress'を使用する必要がある場合、コードにバグがあります。バグを修正し、壊れたMFC実装(壊れたWindows APIを呼び出す)について忘れてください。プラットフォームに依存しない、C++ 11の 'std ::' - 同等の機能は、それを必要としないことです。もしあなたがそうしたならば、あなたはUBの土地にいて、全く保証はありません。 – IInspectable

答えて

3

標準ライブラリにはAfxIsValidAddress()と似たようなものはありません。その機能はあまりにも多くのバリデーションを実際には行わないようです。

AfxIsValidAddress (and Others) Don’t Work as Advertisedを参照してください。この関数は、NULLに対してチェックを行うだけです。 IsBadWritePtrIsBadHugeWritePtrIsBadReadPtrIsBadHugeReadPtrIsBadCodePtrIsBadStringPtr:機能的に類似したいくつかのWin32 APIがあります

:それはまた、有効なアドレスチェック機能の家族について言うためにこれを持っています。これらの 機能は修復を超えて破壊されており、決して使用されるべきではないことが少なくとも2004年以来知られています。 全能のRaymond ChenとLarry Ostermanの両方が理由を 詳細で議論していますので、ちょうど短いRehash:IsBad * Ptrは、試験済みのアドレス にアクセスしてスローされた例外をキャッチすることですべて機能します。問題は、 これらのアクセス違反のいくつか(スタックガード ページのもの)が決して捕捉されるべきではないということです.OSはそれらを使用して スレッドスタックを適切に拡大します。

私はそれだけでポインタができるだけポインタの使用を制限するために、まだnullptrか良くないことを確認するために、標準C++の手順に従った方が良いと思います。

関連する問題