繁体   English   中英

Seg fault unique_ptr具有工厂设计尝试

[英]Seg fault unique_ptr with factory design attempt

尝试使用unique_ptr创建派生类的实例时,我遇到了segmentation fault 之前,我已经编写了七个派生类的每个实例,一个接一个地编码,代码工作正常。

目前的代码如下:

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

你认为有什么理由可以解决这个错误吗?

function createInstance有机会返回nullptr ,需要检查指针是否有效:

if (domain.get())
{
  domain->readDatabaseFields (database_config);
}

这一行是错误的:

ComumPtr ptr;       // initialized to nullptr.

虽然我理解无效是如此简单 ,但它也是用脚射击自己的最好方法(无论是用C ++还是Java),因为现在需要检查这个函数结果的任何单一用法。

相反,你可以:

  • 使用Null对象: readDatabaseFields方法将不执行任何操作
  • 选择抛出异常而不是返回空指针

上述替代方案本身并不比另一种更好,它在很大程度上取决于具体情况; 但是两者都比返回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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM