[英]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),因為現在需要檢查這個函數結果的任何單一用法。
相反,你可以:
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.