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


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。请参阅有关如何操作的文档 使用视觉C++"选中" 迭代器控制台应用程序3 e:\programs\vc\include\xutility 2372

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

其中有std::copy.

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

您可以按照错误的建议-D_SCL_SECURE_NO_WARNINGS禁用此弃用。

这可能会解决你的问题;它涉及用"checkedarray iterator"包装原始指针,这意味着(至少在调试中)如果你弄错了,你会得到断言和/或异常,而不是内存损坏。

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

一种安全的调用复制的方法,没有出错的风险。我假设编译器不会对此发出警告:

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

您的代码虽然不完美,但格式良好,应由符合标准的编译器对其进行编译。也许您启用了将警告视为错误的选项。

警告

消息描述如何禁用警告。