【问题标题】:Instantiate an object separately for shared pointer C++为共享指针 C++ 单独实例化一个对象
【发布时间】:2018-01-27 04:36:25
【问题描述】:

下面的代码可以正常工作:

std::map<std::string,std::ofstream*> m_jsTabFilesMap;
m_jsTabFilesMap.insert({ listOfTabNames[i], new std::ofstream(jsFilename)});

但是如果我用共享指针替换普通指针,插入函数会抱怨不存在函数insert() 的重载版本。

std::map<std::string, std::shared_ptr<std::ofstream>> m_jsTabFilesMap;

我该如何解决这个问题?这与我使用 new 实例化对象的方式有关。

【问题讨论】:

  • m_jsTabFilesMap.insert({ listOfTabNames[i], new std::ofstream(jsFilename)});改成std::map&lt;std::string, std::shared_ptr&lt;std::ofstream&gt;&gt; m_jsTabFilesMap;后还在用吗?

标签: c++ c++11 pointers shared-ptr smart-pointers


【解决方案1】:

采用T*std::shared_ptr&lt;T&gt; 的构造函数是explicit,这是有充分理由的。在传入原始指针时隐式创建拥有智能指针会自找麻烦。

这意味着您必须更改插入函数的方式。为了保持异常安全,原始指针 -> 智能指针转换通常一次发生一次,或者通过函数发生。在您的情况下,最好使用std::make_shared

std::map<std::string, std::shared_ptr<std::ofstream>> m_jsTabFilesMap;
m_jsTabFilesMap.insert({ listOfTabNames[i], std::make_shared<std::ofstream>(jsFilename)});

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2010-12-29
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多