gpt4 book ai didi

c++ - 如果未分配返回值,是否需要删除或释放动态数组?还是被函数删除了?

转载 作者:行者123 更新时间:2023-11-30 01:14:29 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

int *arrExpand(int *arr, int arrSize)
{
int *p = new int [arrSize * 2];
for(int i =0; i < arrSize * 2; i++)
{ if(i < arrSize)
p[i] = arr[i];
if(i > arrSize)
p[i] = 0;
}
return p;
}

int main()
{
int mySize = 5;
int myArr[5] = {1,2,3,4,5};

cout << "Array: ";
for(auto v: myArr)
cout << v;
for( int i = 0; i < mySize * 2; i++)
cout << endl << *(arrExpand(myArr,mySize)+i);
//return is not assigned == delete not needed?
return 0;
}

由于返回未分配,该函数是否删除并释放内存?是否需要释放内存?

最佳答案

如前所述,您确实需要delete[] 内存。您只需记住这个简单的规则即可:

delete everything you newed exactly once. The same applies to delete[] and new[].

但是我不同意智能指针的建议。虽然 std::unique_ptr 作为大型旧代码库(如 here 所述)中原始数组的直接替代品会有一些优势,但更自然的选择是 std::vector :

std::vector<int> arrExpand(int *arr, int arrSize)
{
std::vector<int> p (arrSize * 2);
for(int i =0; i < arrSize * 2; i++)
{ if(i < arrSize)
p[i] = arr[i];
if(i > arrSize)
p[i] = 0;
}
return p;
}

甚至更好

std::vector<int> arrExpand(const std::vector<int> &arr)
{
std::vector<int> p (arr.size() * 2);
for(int i =0; i < arr.size() * 2; i++)
{ if(i < arr.size())
p[i] = arr[i];
if(i > arr.size())
p[i] = 0;
}
return p;
}

通常(至少我不知道反例)使用 std::vector 作为标准运行时大小的数组是一个很好的主意。一个很好的理由是自动和正确的内存管理。它还带有很多有用的成员函数,包括知道它自己的大小。

关于c++ - 如果未分配返回值,是否需要删除或释放动态数组?还是被函数删除了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30156514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com