请考虑以下代码:
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会释放内存吗?
答案 0 :(得分:3)
您的代码是完全有效的C ++并且没有内存泄漏。您可以根据需要随时复制指针,delete
任何范围内的任何副本都具有相同的效果。
然而,这仍然是不好的做法,你不应该写这样的代码。原始new
和delete
的使用太容易出错,并且会导致代码难以维护。相反,请使用RAII包装器类型,例如std::unique_ptr
,std::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个值。)