3

このリンクでは:

http://blogs.msdn.com/b/oldnewthing/archive/2011/04/06/10150261.aspx

最近、次の行が指摘されました。

Widget *pwidOld = reinterpret_cast<Widget*>
                 (InterlockedCompareExchangePointerRelease(
                  &reinterpret_cast<PVOID&>(g_pwidCached),
                  pwid, NULL));

良性の問題と深刻な問題が 1 つずつあります。

良性の 1 つは、戻り値の型で static_cast を実行できることです。

深刻なものは次のようです。

&reinterpret_cast<PVOID&>(g_pwidCached)

厳密なエイリアシングでは、関数に &(void*&)g_pwidCached を渡すと、コンパイラは g_pwidCached の値が変更されていないと見なすことができると言われました。オブジェクトの型ではなく、char* ではありません (g_pwidCached は void* ではないため、Widget* です)。3.10/10 が該当するようです。

これは特定のコンパイラの実装の単なる機能であり、その行が正しく動作することを Visual C++ が保証するだけですか?

4

2 に答える 2

0

のタイプg_pwidCachedが間違っています。

void* g_pwidCached;

それを使用する唯一のものは、それを として扱いますvoid*

(間違いなく間違いであり、値をローカルに取得し、ローカルを使用して削除するためにdelete g_pwidCached;行う必要があります)InterlockedExchangePointer(nullptr, &g_pwidCached)

しかし、より良いコードを含め、これらすべては、そのブログ投稿のコメントで対処されました。

于 2013-10-01T15:21:37.583 に答える