使用std :: copy而不是manual for循环复制动态数组的好处是什么?

Mag*_*s W 2 c++ arrays deep-copy visual-studio c++11

假设我有以下代码:

int* intPtr = new int[5];

// ...do stuff...
Run Code Online (Sandbox Code Playgroud)


现在,我想将intPtr复制到一个相同的新数组中:

int* newIntPtr = new int[5];
Run Code Online (Sandbox Code Playgroud)


这可以使用简单的for循环或std :: copy()来完成:

  1. 使用for循环

    for (int i = 0; i < 5; i++)
        *(newIntPtr + i) = *(intPtr + i);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用std :: copy()

    std::copy( intPtr, intPtr + 5, newIntPtr );
    
    Run Code Online (Sandbox Code Playgroud)


使用std :: copy(),我在Visual Studio中收到警告:

warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe...
Run Code Online (Sandbox Code Playgroud)


可以使用stdext::checked_array_iterator<int*>,使报警消失:

std::copy(intPtr, intPtr + 5, stdext::checked_array_iterator<int*>(newIntPtr, 5));
Run Code Online (Sandbox Code Playgroud)

但这意味着代码将无法在Visual Studio之外的任何其他语言上编译。

那么,我该如何解决呢?我应该使用简单的for循环并有效地避免该警告,还是应该使用std :: copy()并采取某些措施来避免该警告?显然,我可以禁用该警告,但这似乎不是一个适当的解决方案……或者是吗?

Rad*_*ado 5

std::copy通过循环使用有一些好处:

  1. 该呼叫是自记录的。您的呼叫读者可以立即知道该语句的目的,而不必阅读注释或弄清楚循环的作用
  2. 可能会针对您的情况针对简单类型进行优化:

实际上,如果值类型为TriviallyCopyable ,则std :: copy的实现应避免多次分配,并使用大容量复制功能,例如std :: memmove

  1. 更易于维护。您的容器将来更容易更换。您只需要更改参数即可复制,无需执行

正如其他评论所提到的,循环和复制调用同样是不安全的,因此警告具有误导性。但是,我将避免对整个应用程序禁用安全警告。相反,请使用#pragma disable