带有可能不安全的参数的std :: copy

时间:2017-11-03 23:12:49

标签: c++ visual-c++ copy c++14

所以我有一段旧代码,我试图调试

#include <string>
#include <map>

int main()
{
  std::map<std::wstring, std::wstring> filters;

  ...
  for (auto filterIter : filters)
{
   ...
   wchar_t* nameArray = new wchar_t[filterIter.first.size() + 1];
   std::copy(filterIter.first.begin(), filterIter.first.end(), nameArray);
   nameArray[filterIter.first.size()] = '\0';
   ...
   LPCWSTR pszName = nameArray;
}

getchar();
return 0;
}

这里的问题是我收到这个警告说:

warning C4996: 'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

我想解决这个警告,而不必沉默警告。我知道问题在于nameArray是一个常规指针而不是Output iterator。并且std :: copy要我在std :: copy last参数中输入输出迭代器。我想让这段代码符合std :: copy要我做的事情。什么是实现这一目标的优雅方式?

我确实考虑过创建自己的迭代器类,但那真的很优雅吗?

1 个答案:

答案 0 :(得分:0)

我打算回答这个问题,因为我认为我已经弄明白了,这会帮助遇到这个问题的其他人:

事实证明,这是一种非常简单的C复制方式。由于LPCWSTR只是一个wchar_t,我最终只是这样做而且我不再遇到编译器错误。我将运行测试以确保此功能仍然表现相同。

注意:我没有编写此代码,这只是我正在查看的遗留代码。

这是更新版本

#include <string>
#include <map>

int main()
{
  std::map<std::wstring, std::wstring> filters;

  ...
  for (auto filterIter : filters)
{
  ...
  LPCWSTR pszName = filterIter.first.c_str();
  ...
}

getchar();
return 0;
}