2012-03-30 14 views
2

tryブロックでは、新しいネイティブオブジェクトをstd :: listに設定しています。私の最終的なブロックでは、各ネイティブオブジェクトを削除するリストを反復処理しています。try-catch-finallyのC++/CLIイテレータ例外

私は最終的に反復するときに「式:リスト反復子が互換性がありません」アサーションを取得します。 try-catch-ようやく外

  1. メソッドの戻り値:

    私は3つの試験方法を作成しました。これはうまく動作します。

  2. メソッドはtry内に戻ります。最後に反復処理を行うときに例外を取得します。
  3. メソッドはtry内に戻りますが、catchを削除しました。これはちょうど私が発見した、そして説明することができなかった何かでした。しかし、これもうまくいく。

誰かがここで起こっていることと最善の解決策について説明できますか? a very simple test solution hereをアップロードしました。

これはVS2010ソリューションです。このアプリは64ビット版のWPFアプリですが、必要に応じて簡単に変更できます。

EDIT: 上記の3つのシナリオを示すCLIコードは次のとおりです。

int CLITryCatchFinallyBug_CLI::CliClass::Test1() 
{ 
    // RETURNS AT END. RUNS FINE. 

    std::list<NativeClass*> nativeClassList; 

    try 
    {  

     for(int i=0; i<10; i++) 
     { 
      nativeClassList.push_back(new NativeClass(100,200)); 
     } 

     // NOTICE RETURN IS AT END. 
    } 
    catch(std::exception& e) 
    { 

    } 
    finally 
    { 
     // Delete the native objects. 
     std::list<NativeClass*>::iterator deleteIterator; 
     for (deleteIterator = nativeClassList.begin(); 
      deleteIterator != nativeClassList.end(); 
      deleteIterator++) 
     { 
      delete *deleteIterator; 
     } 
    } 

    return 1; 
} 

int CLITryCatchFinallyBug_CLI::CliClass::Test2() 
{ 
    // RETURN WITHIN TRY. GETS EXCEPTION IN FINALLY. 

    std::list<NativeClass*> nativeClassList; 

    try 
    {  

     for(int i=0; i<10; i++) 
     { 
      nativeClassList.push_back(new NativeClass(100,200)); 
     } 

     // NOTICE RETURN IS HERE WITHIN TRY 
     return 1; 
    } 
    catch(std::exception& e) 
    { 

    } 
    finally 
    { 
     // Delete the native objects. 
     std::list<NativeClass*>::iterator deleteIterator; 
     for (deleteIterator = nativeClassList.begin(); 
      deleteIterator != nativeClassList.end(); 
      deleteIterator++) // WILL GET EXCEPTION HERE! 
     { 
      delete *deleteIterator; 
     } 
    } 
} 

int CLITryCatchFinallyBug_CLI::CliClass::Test3() 
{ 
    // SAME AS TEST 2 BUT WITHOUT THE CATCH BLOCK. NO EXCEPTION. 

    std::list<NativeClass*> nativeClassList; 

    try 
    {  

     for(int i=0; i<10; i++) 
     { 
      nativeClassList.push_back(new NativeClass(100,200)); 
     } 

     // NOTICE RETURN IS HERE WITHIN TRY 
     return 1; 
    } 
    // NOTICE THIS IS THE SAME AS TEST2 EXCEPT I'VE REMOVED THE CATCH 
    finally 
    { 
     // Delete the native objects. 
     std::list<NativeClass*>::iterator deleteIterator; 
     for (deleteIterator = nativeClassList.begin(); 
      deleteIterator != nativeClassList.end(); 
      deleteIterator++) // UNLIKE TEST2, NO EXCEPTION 
     { 
      delete *deleteIterator; 
     } 
    } 
} 
+4

人々に全体のソリューションをダウンロードするように依頼するのではなく、質問に投稿できる短くて完全なコンソールアプリケーションを作成できませんか? –

+0

途中で返ってきたら、メソッドレベルでスコープされたstd :: listは、finallyブロックに達するまでにすでにクリーンアップされている可能性があります(デストラクタが呼び出されました)。 –

+2

私の後ろで繰り返し:「これはC++です。私はRAIIを例外安全のために使用し、try-finallyでは使用しません。私はRAIIを例外安全のために使用し、try-finallyでは使用しません。 –

答えて

0

私はC++/CLIの例外処理の実装があまりにも早くネイティブC++の型を破棄しているようですVS 2013で同じ問題を見てきました。例外は、catchブロックがあり、tryブロックに明示的な復帰がある場合にのみ発生します。

const CString foo = "foo"; 
try 
{ 
    return; 
} 
catch (Exception^ ex) 
{ 
} 
finally 
{ 
    const CString bar = foo; // AccessViolationException 
} 

私はMSにreport the bugしようとしたが、どうやら私は「この接続のためのフィードバックを送信する権限がありません。」よ

関連する問題