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
答案 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));
您的代码虽然不完美,但形式良好,标准兼容的编译器应该编译它。也许您已启用一个将警告视为错误的选项。
警告消息描述了如何禁用警告。