2012-03-05 17 views
1

私はC++を初めて使い、auto_ptrに関してちょっと混乱しました。自動ポインタの問題

内部に静的なauto_ptrがあるクラスがあります。

static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection()); 

Utilの:: getDBConnection()の実装:

CConnection* util::getDBConnection(){ 
     try 
     { 
      cout<< &MyCompany::GetFermatConnection();     
      return &MyCompany::GetFermatConnection();    
     } 
     catch(...) 
     { 
      //connect to local DB 
      throw; 
     } 
    }  

私のプログラムが終了したときにしかし、それは常に自動ポインタのデストラクタの間に、メモリ内の例外をヒット。

~auto_ptr() 
    { // destroy the object 
    if (_Myptr != 0) 
     delete _Myptr; // exception in this line. 
    } 

例外は "TestDLL.exeに0x00000001800024e8で未処理の例外:0xc0000005で:アクセス違反読み取り位置0xffffffffffffffff" です。

私は、auto_ptrがスコープの終わりに達するとメモリを解放しようとすることを理解します。 しかし、この場合、私は何がうまくいかないのか分かりません。考えられる原因は誰か知っていますか?

+0

'auto_ptr'は正しく初期化されていますか?あなたは 'util :: getDBConnection()'にブレークポイントを入れて、それが何を返すのを見ることができますか? – Naveen

+0

'util :: getDBConnection()'はanychanceによって-1を返しますか? –

+0

ブレークポイントは、util.getDBConnectionが0000000002899A20を返すことを示します。 – Rudy

答えて

2

util::getDBConnectionの実装を示していますが、返すものが最終的にnewで割り当てられたかどうかという疑問には実際には答えません。

もしそうだった場合、そのポインタを削除しようとするとエラーメッセージが表示され、ヒープが破損している可能性があります。

それはnewに割り当てられていない何かを返していた場合、問題はさらに簡単です - auto_ptrがポインタにdeleteを使用しているので、それが唯一のnewで割り当てられた何かを使用することができます。これを他の方法で割り当てられたポインタで使用すると、UBが得られます。

2

あなたのコードの詳細はわかりませんが、私はそれらを削除すると-1へのポインタを設定するコードがあり、同じポインタの二重削除からのクラッシュであると推測します。

COMとauto_ptrはおそらく混在すべきではありません。これは、コードのCOM ::部分で起こっているようです。

auto_ptrは「強力なポインタ」のほうが多い - それを所有していて、それが削除されない限り削除します。

COMは、リファレンスカウントモデルを使用します。オブジェクトは参照カウント1で作成されます。新しい参照はAddRefでなければならず、もはや必要でないときはRelease()です。

代わりにthisのようなCOM固有のスマートポインタを見てください。

私は誤ってCOMシナリオについて推測している場合はお詫び申し上げます。

+0

申し訳ありません。 COM = Company_name。私は掲示する前に私の会社名を隠す方針を持っています。私は混乱を取り除くために私の質問を更新しました – Rudy

+0

心配しないでください。コードがポインタをうまく使用していると仮定すると、私はまだダブル削除/フリーに賭けるつもりですが、どこに確実性がないのでしょうか。可能であれば、CConnectionのデストラクタにブレークポイントを追加してください。うまくいけば、そのタイプのインスタンスがあまりないので、問題を追跡するのに役立ちます。 – Joe