【发布时间】:2013-10-05 10:42:46
【问题描述】:
我知道这个问题在 SO 中被问过很多次,但这与其他问题有所不同。
Compiler Error: Function call with parameters that may be unsafe
xutility(2227): warning C4996: 'std::_Copy_impl'
失败的代码片段
DWORD dwNumberOfNames = pExportDirectory->NumberOfNames;
LPDWORD dwNames = (LPDWORD)((LPBYTE)hDLL + pExportDirectory->AddressOfNames);
std::vector< std::string > exports;
std::copy(
dwNames,
dwNames + dwNumberOfNames,
[&exports, &hDLL](DWORD dwFuncOffset)
{
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
exports.push_back(fname);
}
);
编译器错误
错误 1 错误 C4996:“std::_Copy_impl”:带参数的函数调用 这可能是不安全的——这个调用依赖于调用者来检查 传递的值是正确的。要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 的文档 11.0\VC\include\xutility 2176
问题
考虑到C4996,表示该函数被标记为已弃用 问题出在哪里?
- MS 认为使用 std::copy 是不安全的,会被弃用吗?
- 是因为我使用了
std::copy和C Array? - 是因为我使用 Lambda 表达式的方式吗?
- 如果不推荐使用 std::copy,如果我需要便携,还有什么替代方法。
注意
我知道,如何抑制警告,但我很想知道问题的根本原因?
另外,对我来说同样重要的是,在不影响代码质量的情况下处理此问题的可移植方式。
【问题讨论】:
-
std::copy 的第三个参数应该是一个输出迭代器,但是你有一个不返回迭代器的 lambda。
-
(1) :使用
std::copy,您不确定是否有足够的“位置”用于输出迭代器,因此可能存在缓冲区溢出。 -
@Jarod42 请参阅下面的答案,如果您将
std::back_inserter与标准容器一起使用,则不会出现溢出问题。
标签: c++ visual-c++ visual-studio-2012 c++11