0

アプリケーションをデバッグすると、コード内の throw ステートメントでコードが即座にクラッシュします。

try
{
    char newbuff[8];
    if(strlen(cstr) > sizeof(newbuff))
    {
         throw BUFFER_TOO_SMALL;
    }
    if(strlen(cstr) == 0)
    {
         throw NO_CONTENT;
    }
    strcpy(newbuff, cstr); //Yeah yeah yeah, I know, I'm just learning
    ptr = newbuff;
}
catch(int errn)
{
     cout << "error: ";
     if(errn == BUFFER_TOO_SMALL)
     {
          cout << "storage buffer too small.\n";
          return 0;
     }
     if(errn == NO_CONTENT)
     {
          cout << "no content inside of buffer.\n";
          return 0;
     }
}

そのため、デバッグ時に throw ステートメントでクラッシュします。興味深いことに、CLI (この場合は「cmd.exe」) に次のメッセージが表示されます (これは私が入力したものではなく、コンパイラまたは OS からのものです)。

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

以前は C でプログラミングしていたので、今は C++ に傾倒しています。おわかりのように、現在、C++ が使用する try-catch 例外処理システムを管理しようとしています。

4

2 に答える 2

0

if名前はポインターを示し、そのサイズは 32 ビット システムでは4、64newbuffビット システムでは 8 になります。ああ、そうです、コードを編集して の定義をnewbuff配列として表示したことを投稿した後です。とにかく。

throwハンドラがない場合、 がクラッシュする可能性があります。この場合、標準では、スタックを巻き戻す (ローカル オブジェクトを破棄する) 必要はありません。

それBUFFER_TOO_SMALLは定数、おそらく整数のようです。整数を投げるべきではありません (自分が何をしているのか本当にわかっている場合を除きます)。std::exceptionオブジェクトを投げますstd::runtime_error

編集:更新されたコードは、あなたがキャッチしていることを示していますint. つまり、大文字の定数は ではありませんint。しかし、アドバイスはとにかく有効です。

定数にすべて大文字を使用するスタイルの問題もあります。しないでください。これは Java 主義です。C および C++ では、慣例により、すべての大文字はマクロおよびマクロ専用です。

乾杯 & hth.,

于 2011-06-21T01:21:16.763 に答える
0

newbuff には NULL ターミネータ用のスペースがないようです。newbuff[8] のサイズを newbuff[9] に変更する必要があります。

于 2011-06-21T01:38:33.967 に答える