新的和删除不同的范围

时间:2016-02-01 23:51:40

标签: c++ c++11 visual-c++ c++14

请考虑以下代码:

int *expand_array(int *old_arr,int array_length)
{
    int *new_arr = new int[array_length +3];
    for(int counter=0;counter<array_length;counter++)
    new_arr[counter]=old_arr[counter];

    delete[] old_arr;
    return new_arr;
}

int main()
{
     int *my_first_arr = new int[4];
     int *my_expanded_arr=expand_array(my_first_arr,4);
     delete[] my_expanded_arr;
 }

这里会有任何内存泄漏吗? 并概括了这个问题, 如果从新语句返回的指针被复制,传递给函数或分配给不同的指针,delete replication_pointer会释放内存吗?

2 个答案:

答案 0 :(得分:3)

您的代码是完全有效的C ++并且没有内存泄漏。您可以根据需要随时复制指针,delete任何范围内的任何副本都具有相同的效果。

然而,这仍然是不好的做法,你不应该写这样的代码。原始newdelete的使用太容易出错,并且会导致代码难以维护。相反,请使用RAII包装器类型,例如std::unique_ptrstd::shared_ptr,或者在本例中为std::vector

您问题中的代码基本上与此相同。

int
main()
{
  auto numbers = std::vector<int>(4);
  numbers.resize(7);
}

很简单,没有?

答案 1 :(得分:1)

为什么你认为会有内存泄漏?当然不会有。

但是此代码中存在不同的错误。如果新的数组大小大于现有old_arr的大小,那么将旧数组复制到新分配的int数组的代码将复制得太多,在结束时运行旧数组,导致未定义的行为;可能是崩溃(旧数组大小是2个整数,array_length是10,for循环将尝试从只有2个的旧数组中复制10个值。)