c++ auto_ptr和shared_ptr从vc++ 10到vc++ 12的变化

C++ auto_ptr and shared_ptr changes from VC++10 to VC++12

本文关键字:vc++ ptr 变化 auto shared c++      更新时间:2023-10-16

我正致力于将Visual Studio和c++ 10的代码库更新到VS/c++ 12

我遇到了一个关于shared_ptr和auto_ptr的棘手问题。

原始c++ 10中的代码为

void CommandLoader::RegisterCommand(std::auto_ptr<ILoadableCommand> cmd)
{
assert(cmd.get() != NULL);
m_pImpl->m_registered.push_back(shared_ptr<ILoadableCommand>(cmd));
}

编译错误是:

error C2440: '<function-style-cast>' : cannot convert from std::auto_ptr<ILoadableCommand>' to 'std::shared_ptr<ILoadableCommand>'

在编辑器中,它会报错

Error: no instance of constructor"std::shared_ptr<_Ty> matches the argument list.

我的猜测是auto_ptr不再被接受为shared_ptr的构造函数的参数,但http://msdn.microsoft.com/en-us/library/bb981959.aspx另有说明。

我有点不知所措,所以任何帮助都会很好!

总之:不要使用auto_ptr。它基本上是坏的。使用std::unique_ptr代替。

你使用auto_ptr的方式也很奇怪:

void CommandLoader::RegisterCommand(std::auto_ptr<ILoadableCommand> cmd)

这意味着每次调用这个函数时,它都会创建一个新的auto_ptr,该auto_ptr获取缓冲区的所有权。然后你把它的所有权给一个shared_ptr。

这听起来像是你应该给函数一个原始指针,或者至少接受一个引用的情况:

void CommandLoader::RegisterCommand(std::unique_ptr<ILoadableCommand>& cmd)