分别为共享指针C ++实例化一个对象

时间:2017-08-18 13:10:31

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

以下代码可以正常使用:

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

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

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

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

1 个答案:

答案 0 :(得分:8)

std::shared_ptr<T>的构造函数T*explicit,并且有充分的理由。

表示在传入原始指针时隐式创建拥有智能指针。

这意味着您必须更改插入函数的方式。保持异常安全,原始指针 - &gt;智能指针转换通常应该一次发生一次,或通过函数发生。在您的情况下,最好使用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)});