需要一个干净的替代品来对std :: copy进行可能不安全的调用

时间:2013-09-04 03:43:43

标签: c++ arrays visual-studio pointers visual-studio-2013

我知道有更好的选择,比如std::vectorstd::array等。在我的情况下,我必须使用指向动态分配数组的指针,因为我正在学习副本 - 和 - 交换习语,它涉及创建我自己的资源管理类。

假设我有一个资源句柄类的后续复制构造函数:

A(const A& other) : size(other.size), arr(size ? new int[size]() : nullptr) {
    std::copy(other.arr, other.arr + size, arr);
}

它不能在Visual Studio(2013 Preview或2012 Express)中编译。我得到的错误是: enter image description here

是否可以以另一种方式使用std::copy,以便编译器停止对我大喊大叫?或者使用像

这样的简单循环手动复制数组的内容是一个更好的主意
for (int i = 0; i < size; i++) 
    arr[i] = other.arr[i];

P.S。我不想使用任何黑客/宏来禁用警告等。

2 个答案:

答案 0 :(得分:2)

据我所知,您已在项目中启用“将警告视为错误”(请参阅/WX here)。禁用该标志,重新编译。在Windows + msvc上启用此标志不是一个好主意,因为某些警告只是坚果(在包含windows.h的任何程序中尝试/Wall/W4。)

要清除警告,请在项目属性中#define D_SCL_SECURE_NO_WARNINGS。或者用vector替换容器。您还可以使用编译器编译指示禁用特定警告。

答案 1 :(得分:1)

您有几种选择:

1)定义D_SCL_SECURE_NO_WARNINGS,如错误消息所示。此外,您是否打开了“警告错误”?看来这应该是警告,而不是错误。 (编辑:我现在看到你不想使用这种方法)。

2)使用checked_array_iterator(但这不是标准的):

std::copy(other.arr, other.arr + size, stdext::checked_array_iterator<int*>(arr, size));

3)使用std::vector这是最好的方法。