1

私はいくつかのコードで少し立ち往生しています。getToto()通常は a を返すメソッドの戻り値の型を使用する必要がありますstd::stringが、ある場合は戻りますfalse(使用する必要があるライブラリの一部であり、変更できません)。それがヌルポインタに相当することは理解しています。しかし、私はそれを捕まえる適切な方法を見つけることができません!

テスト.cpp

static std::string getToto(){
 char buffer[1024];
 if ( CTX_Get_Env(buffer, "Toto", 1024) )
    return false;
 return buffer;
}

私が試したら

const char* returned = Test::getToto().c_str();
if (returned==NULL){
    std::cout<< "null pointer"<<std::endl;
}

実行中にエラーが発生する

「std::logic_error」のインスタンスをスローした後に呼び出される終了

what(): basic_string::_S_construct NULL が無効です

申し訳ありませんが、私は C++ のレベルがかなり低いです。

4

3 に答える 3

3

場合によります。ロジックの空の文字列部分を返しているか、例外的な状態ですか。

発生するはずがない場合は、エラーをスローする必要があります。

文字列が空でよい場合は、空の文字列を返す必要があります。

 return std::string();

そのままコンパイルする理由は、falseが として解釈され0、これはNULLである可能性があるchar*ため、そこから文字列を構築しようとするためです。std::stringただし、ポインターからの構築NULLは無効であるため、例外が発生します。

コーディング方法は次のとおりです。

static std::string getToto(){
   char buffer[1024];
   if ( CTX_Get_Env(buffer, "Toto", 1024) )
      throw InvalidDataInBufferException();
   return buffer;
}

文字列が空であってはならない場合、または

static std::string getToto(){
   char buffer[1024];
   if ( CTX_Get_Env(buffer, "Toto", 1024) )
      return std::string();
   return buffer;
}

文字列を空にしても問題ない場合。

于 2012-11-20T16:23:23.803 に答える