過去に、ソフトウェアでさまざまなメモリリークが発生しました。これらは主に、Queue-Message-Dataなどを解放する独自の「無料」メソッドの誤った使用が原因で発生したことがわかりました。
問題は、私たちの最も深いツール関数には、動的に割り当てられたメモリを解放するための2つの方法があり、次のシグネチャがあります。
void free (void *pData);
void free (void **ppData);
どちらの方法も基本的に同じことを行いますが、2番目の方法が最初にデータを逆参照する点が異なります。これら2つのうちの一方だけですべてを実行できることは知っていますが、ソフトウェアは何年も前にそのように設計されており、現在は両方を使用してコードがどこにでもあると言えます。
誰かが次のようにこれらのメソッドの呼び出しを実装すると、問題が発生します。
QueueMessage *pMsg;
pMsg = myQueue.read(...); // dynamically allocates space for the msg and fills it
// Do something
myQueue.free(&pMsg); // << WRONG!
上記のコードは、メッセージへのポインタをfree-methodに渡す必要があります。基本的には機能しますが、この場合、コンパイラはどの関数を使用するかわからないため、ポインタが指すメモリではなく、ポインタfree(void *pData)
を解放しようとするメソッドを使用します。もちろん、解決策は次のいずれかで簡単です。または
myQueue.free(pMsg);
myQueue.free((void**)&pMsg);
どちらも機能します。問題と解決策について説明したので、知りたいのですが、これらのメソッドを使用するプログラマーがそれらを正しい方法で使用することを保証できる方法はありますか?VS2005のヘッダー注釈について読んだことがあります。これは非常に便利ですが、必要なことを実行していないようです。ポインターの参照が最初のメソッドに渡された場合に警告を生成する方法があれば素晴らしいので、プログラマーは少なくとも自分のコードに何か問題があるというヒントを得ることができます。
ちなみに、私はMicrosoft VS2005を使用しており、必要に応じてVS2008にアップグレードする可能性があります。これはVS2005に移行されたC++アプリケーションであるため、.NET互換です。