2012-01-27 7 views
0

通常のポインタのみを使用する、かなり大きなレガシーアプリケーションがあります。 今、私は新しいモジュールを追加しています。より現代的なものを使用しようとしています。スマートポインタ。ポインタとshared_pointerを使用すると、削除時にアクセス違反が発生する

メインモジュールは、通信DLLを介して新しいサブモジュール(通常のポインタを使用)にメッセージを送信します。 私の新しいサブモジュールでは、メッセージ処理のためにshared_pointerを使用しています。 共有ポインタがポインタを削除しようとすると、VTableポインタが0xddddddddなので、メッセージのデクストラクタでアクセス違反が発生します。私は既にthis SO questionを見つけました。これは、ポインタがすでにリリースされているためです。

共有ポインタが削除する前に、メインモジュールがすでに通常のポインタを削除しているようです。

私は古いメインモジュールで共有ポインタを使用したくないですが(現時点では非常にリファクタリングしていますが)、アプリケーションで通常のポインタと共有ポインタの両方をどのように使用できるのかを解決する方法はありますか? デストラクタの通常のNULLチェックは役に立ちません。

答えて

1

メインモジュールがポインタの所有権を転送することを確認する必要があります。
つまり、モジュールに送信された後、そのアドレスへのポインタを保持しないでください。さもなければ、それはあなたのモジュールをぶら下がりポインタで残しているポインタの割り当てを解除するかもしれません。

したがって、メインモジュールがポインタへの参照を保持している場合は、shard_ptrをモジュールに使用するだけでは意味がありません。その場合は、メインモジュールでshared_ptrも使用する必要があります。

また、shared_ptr::deleter()のポインタに適切なメモリ割り当て解除ルーチンを使用していることを確認する必要があります。
ポインタに割り当てルーチンと割り当て解除ルーチンが誤って一致している可能性があります。

+0

これは、従来のアプリケーションを改善するときに何をすべきかを理解するのに役立ちました。しかし、私は問題を絞り込んで、それは私のサブモジュールに問題があるようです。 – Simon

+0

@サイモン:いいえproblem.Wishあなた運が:) –

関連する問題