有没有办法删除另一个函数中动态分配的数组?
Is there any way to delete a dynamically allocated array in another function?
我正在学习 C++ 中的指针。这是老师给我的练习:
6. Duplicate a given array.
int* copyArray(int* arr, int n)
我的函数:
int* copyArray(int* arr, int n)
{
int* copy = new int[n];
for (int i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
我的主要功能:
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
int* copyPtr = new int[8];
copyPtr = copyArray(a, 8);
for (int i = 0; i < 8; ++i)
cout << copyPtr[i] << " ";
delete[] copyPtr;
}
有什么方法可以从 main 函数中删除 copy 数组吗?我了解智能指针的使用,但由于老师给的原型,我无法在这种情况下使用它。
我怀疑当我们说“删除指针”时,您对通常的不精确感到困惑。更正确的说法是 delete[] x
删除了 x
指向的数组。
在main
你做
copyPtr = copyArray(a, 8);
现在copyPtr
确实指向数组的副本。当你写
delete[] copyPtr;
您删除数组的副本。
您错过的是删除您通过 int* copyPtr = new int[8];
创建的初始数组,因为您丢失了指向它的任何指针,所以您无法再删除它。您可以保留指向该初始数组的指针并将其删除。但是,分配一个数组只是为了丢弃它并在函数内部创建一个新数组是没有意义的。将您的代码更改为
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
int* copyPtr = copyArray(a, 8);
for (int i = 0; i < 8; ++i)
cout << copyPtr[i] << " ";
delete[] copyPtr;
}
PS:
I understand the use of smart pointers but I cant use it in this case because of the prototype given by my teacher.
你的结论不对。智能指针可以很好地与原始指针进行互操作。您只需要注意所有权即可。 int* arr
作为原始指针传递。那完全没问题,因为该函数不参与该数组的所有权。它只是读取它的值。原始指针用于 non-owning 指针。如果你想获得返回指针的所有权,你可以使用 std::unique_ptr<int[]>
:
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
auto copy = std::unique_ptr<int[]>(copyArray(a,8));
for (int i = 0; i < 8; ++i) std::cout << copy[i] << " ";
// no delete !!! the unique_ptr does that for you
}
我正在学习 C++ 中的指针。这是老师给我的练习:
6. Duplicate a given array.
int* copyArray(int* arr, int n)
我的函数:
int* copyArray(int* arr, int n)
{
int* copy = new int[n];
for (int i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
我的主要功能:
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
int* copyPtr = new int[8];
copyPtr = copyArray(a, 8);
for (int i = 0; i < 8; ++i)
cout << copyPtr[i] << " ";
delete[] copyPtr;
}
有什么方法可以从 main 函数中删除 copy 数组吗?我了解智能指针的使用,但由于老师给的原型,我无法在这种情况下使用它。
我怀疑当我们说“删除指针”时,您对通常的不精确感到困惑。更正确的说法是 delete[] x
删除了 x
指向的数组。
在main
你做
copyPtr = copyArray(a, 8);
现在copyPtr
确实指向数组的副本。当你写
delete[] copyPtr;
您删除数组的副本。
您错过的是删除您通过 int* copyPtr = new int[8];
创建的初始数组,因为您丢失了指向它的任何指针,所以您无法再删除它。您可以保留指向该初始数组的指针并将其删除。但是,分配一个数组只是为了丢弃它并在函数内部创建一个新数组是没有意义的。将您的代码更改为
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
int* copyPtr = copyArray(a, 8);
for (int i = 0; i < 8; ++i)
cout << copyPtr[i] << " ";
delete[] copyPtr;
}
PS:
I understand the use of smart pointers but I cant use it in this case because of the prototype given by my teacher.
你的结论不对。智能指针可以很好地与原始指针进行互操作。您只需要注意所有权即可。 int* arr
作为原始指针传递。那完全没问题,因为该函数不参与该数组的所有权。它只是读取它的值。原始指针用于 non-owning 指针。如果你想获得返回指针的所有权,你可以使用 std::unique_ptr<int[]>
:
int main()
{
int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
auto copy = std::unique_ptr<int[]>(copyArray(a,8));
for (int i = 0; i < 8; ++i) std::cout << copy[i] << " ";
// no delete !!! the unique_ptr does that for you
}