有没有办法在c ++函数中返回数组?
int* returnArray()
{
int* arr = new int[3];
return arr;
}
这种方式arr是一个局部变量,并且在函数返回后,已分配的内存块将丢失。 除了在功能块之外定义一个数组外,还有什么方法吗?
答案 0 :(得分:2)
分配的内存块不会丢失,因为内存是在堆上分配的。将复制指向此内存的指针,并将其正确返回给调用方。换句话说,你的代码没有任何问题 - 除了可能因为调用者必须知道数组大小以便对返回的数组做任何有用的事情。
你可能指的反模式看起来像这样:
// WRONG: returns pointer to local data
int* returnArray() {
int arr[3] = {1, 2, 3};
return arr;
}
这是一个错误,因为在堆栈上分配了arr
,并且该函数返回指向该数据的指针。要修复它,需要将函数声明为返回数组,但C ++不允许这样做,因此必须间接完成。固定功能将如下所示:
struct Array {
int array[3];
};
// correct: generated copy constructor correctly copies arr
Array returnArray() {
Array arr = {{1, 2, 3}};
return arr;
}
在生产代码中,如果您可以使用C ++ 11,那么您的函数将只返回std::array<int, 3>
。 C风格的数组几乎总是用在低级代码中来实现容器,几乎不需要直接从函数中返回它们。
答案 1 :(得分:2)
你正在返回一个指向数组的指针,但是问题是“谁负责删除它”,你可以使用智能指针:
std::unique_ptr<int[]> returnArray()
{
std::unique_ptr<int[]> arr (new int[3]);
return arr;
}
每个人都很开心。此外,您可以使用std::vector
。
std::vector<int> returnArray()
{
std::vector<int> arr(3);
return arr;
}
答案 2 :(得分:1)
你的功能没问题。在使用new
表达式之前,使用delete
表达式获取的内存永远不会被释放。
这是在函数返回时会丢失内存的版本:
// WRONG:
int* returnArray()
{
int arr[3];
return arr;
}
更好的方法是返回std::vector<int>
。
答案 3 :(得分:1)
你有什么工作;问题是你已经让调用者负责记住删除动态数组。这是内存泄漏的好方法。
也许您正在考虑尝试返回本地数组:
int * returnArray() {
int arr[3];
return arr; // BOOM! dangling pointer
}
这是错误的,因为当函数返回时会破坏这个数组;在此之后使用指针将给出未定义的行为。
要解决这两个问题,请返回托管动态数组:
std::vector<int> returnVector() {
std::vector<int> v(3);
return v;
}
答案 4 :(得分:0)
实际上,你的代码很好但是很危险,我的意思是,为arr
分配内存,直到你在它上面调用delete[]
,这意味着你可以安全地访问数组的元素,但委派内存清理使用这种方法来源代码是一种不好的做法,很可能会导致内存泄漏或损坏。
我建议将数组作为参数传递,因此调用代码负责内存管理:
void returnArray(int* arr)
{
... Your code here managing array's contents ...
}
或者,如果这是一个类'方法,请从此类内部管理此内存。
编辑:或者更好,使用@M M建议的智能指针。