C ++数组副本显示vc ++中的错误

Cur*_*ous 5 c++ copy visual-c++

int a[4] = {10,20,30,40};
std::vector<int> vec(4);
std::copy(a, a + 4, vec.begin());
Run Code Online (Sandbox Code Playgroud)

我在vc ++中遇到以下错误,它显示警告,但标记为错误,我该如何解决?

严重性代码说明项目文件行抑制状态错误C4996 std::copy::_Unchecked_iterators::_Deprecatestd::copy使用可能不安全的参数进行调用-此调用依赖于调用者检查传递的值是否正确。要禁用此警告,请使用-D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用Visual C ++“检查的迭代器” ConsoleApplication3的文档:e:\ programs \ vc \ include \ xutility 2372

Yak*_*ont 6

默认情况下,MSVC弃用某些它认为不安全的API。基本上,原始内存访问中的单个参数错误可能会导致读取或写入端的缓冲区溢出。

其中包括std::copy

调用已弃用的API会导致MSVC生成错误消息。

您可以-D_SCL_SECURE_NO_WARNINGS按照错误提示禁用此弃用。

可以解决您的问题;它涉及到用“检查数组迭代器”包装原始指针,这意味着(至少在调试中)获得断言和/或异常,而不是得到错误的内存损坏。

缓冲区溢出是C / C ++应用程序中更普遍的错误之一。除非并且直到您证明给定路径对性能至关重要,否则将它们视为一个严重问题,即使它具有运行时成本也是如此。到那时,找到一种方法来静态证明您的阵列大小正确。

  • 我认为这个答案对 VC++ 太客气了。应该明确指出,std::copy 在 C++ 标准中没有被弃用,而只是被微软不赞成。让 VC++ 专注于自己的业务应该更容易。每当我收到来自 VC++ 的“已弃用”警告时,我总是会进行网络搜索以了解它是否已被完全弃用。 (2认同)