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

时间:2017-02-02 13:53:50

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

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

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

  

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

2 个答案:

答案 0 :(得分:4)

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

其中包括std::copy

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

您可以使用-D_SCL_SECURE_NO_WARNINGS停用此弃用,如错误所示。

This可以解决您的问题;它涉及用一个&#34;检查数组迭代器&#34;来包装原始指针,这意味着(至少在调试中)如果你弄错了,你会得到断言和/或异常,而不是内存损坏。

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

答案 1 :(得分:2)

一种安全的方式来调用副本而不会有大小错误的风险。我认为编译器不会对此发出警告:

int a[] = {10,20,30,40};
std::vector<int> vec;
std::copy(std::begin(a), std::end(a), std::back_inserter(vec));

您的代码虽然不完美,但形式良好,标准兼容的编译器应该编译它。也许您已启用一个将警告视为错误的选项。

警告消息描述了如何禁用警告。