我知道这个问题在SO上已经被问了很多次,但这是与其他不同的变体。
xutility(2227): 警告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 ++“已检查的迭代器”的文档, 请参见C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility2176
问题
考虑到C4996表示该函数已被标记为弃用,问题出在哪里?
- 是我使用了 std::copy,而微软认为这是不安全的并将其弃用吗?
- 是因为我使用了
C 数组
和std::copy
吗? - 是因为我使用 Lambda 表达式的方式吗?
- 如果 std::copy 已被弃用,那么在需要可移植性的情况下,有什么替代方法呢?
注意
我知道如何抑制警告,但我很想知道问题的根本原因。
对我来说同样重要的是,知道如何以不影响代码质量的方式处理此问题的可移植方法。
std::copy
时,您不能确定输出迭代器是否有足够的“空间”,因此可能会发生缓冲区溢出。 - Jarod42std::back_inserter
,则不会出现溢出问题。 - Kevin Anderson