0

を使用して派生クラスのインスタンスを作成segmentation faultしようとすると、が発生します。unique_ptr以前は、7 つの派生クラスのすべてのインスタンス化を順番にコーディングしており、コードは適切に機能していました。

現在のコードは次のとおりです。

typedef std::unique_ptr<Comum> ComumPtr;

ComumPtr createInstance ( string dom, map<string, string> & config, map<string, string> & config_fields )
{
    ComumPtr ptr;       // initialized to nullptr.
    if ( dom == "voice" ) {
    ptr.reset ( new Voice (config, config_fields) );
    //    } else if ( dom == "account" ) {     // FOR OTHER DERIVED CLASSES
    //  ptr.reset ( new Account (config, config_fields) );
    }
    return ptr;
}

// At  main function:
 for (vector<string>::const_iterator cit = for_domain.begin(); cit != for_domain.end(); ++cit) { 
    const char * section (cit->c_str());
    string fsn = *cit + "_fields";
    const char * fields_section_name (fsn.c_str());
    const char * db_section ("Database");

    map <string, string> domain_config = cfg.getSectionConfig (config_file.c_str(), section);
    map <string, string> domain_config_fields  = cfg.getSectionConfig (config_file.c_str(), fields_section_name);
    map <string, string> database_config = cfg.getSectionConfig (config_file.c_str(), db_section);

    std::unique_ptr<Comum> domain = createInstance(*cit, domain_config, domain_config_fields);

    domain->readDatabaseFields (database_config);   // <- segmentation fault

これがセグフォルトの理由だと思いますか?

4

2 に答える 2

1

function createInstancenullptrを返す可能性がある場合は、ポインターが有効であることを確認する必要があります。

if (domain.get())
{
  domain->readDatabaseFields (database_config);
}
于 2013-01-06T11:21:56.087 に答える
1

この行はエラーです:

ComumPtr ptr;       // initialized to nullptr.

nullity がとても簡単であることは理解していますが、この関数の結果の単一の使用をチェックする必要があるため、(C++ であれ Java であれ)自分自身を撃つ最善の方法でもあります。

代わりに、次のことができます。

  • Null オブジェクトを使用します。メソッドreadDatabaseFieldsは何もしません。
  • null ポインターを返すのではなく、例外をスローすることを選択する

上記の選択肢はどれも本質的に他の選択肢よりも優れているわけではなく、状況に大きく依存します。ただし、どちらも null を返すよりはましですunique_ptr

例外メソッドを選択するとします。

ComumPtr createInstance ( string dom, map<string, string> & config, map<string, string> & config_fields )
{
    if ( dom == "voice" ) {
        return ComumPtr ( new Voice (config, config_fields) );
    } 
    if ( dom == "account" ) {
        return ComumPtr ( new Account (config, config_fields) );
    }

    throw std::runtime_error("Unknown config field");
}
于 2013-01-06T13:52:52.887 に答える