我有一个递归函数,每次调用函数时都需要我创建一个新数组。该函数还需要先前创建的数组:
void myFunc(int* prevArray)
{
int newSize;
//do some calculations to find newSize
int* newArray;
newArray = new int[newSize];
//do some calculations to fill newArray
//check some stopping condition
myFunc(newArray);
}
此功能会泄漏内存,但我无法通过添加
来避免这种情况delete [] newArray;
因为我只能在再次调用该函数后添加它。我该如何解决这个问题?
答案 0 :(得分:1)
尝试类似
的内容void myFunc(int* prevArray)
{
int newSize;
...newArray = new int[newSize];
myFunc(newArray);
delete[] newArray;
}
或者更好的是使用std :: unique_ptr来控制newArray内存。通过这种方式,您将遵循关于动态内存的经验法则 - 它应该有一个所有者,负责分配和释放它。
答案 1 :(得分:1)
您可以通过使用动态内存分配来解决此问题。
// allocate initial size
const int INITIAL_SIZE = 5;
int *myArray = malloc(sizeof(int) * INITIAL_SIZE));
int myFunc(int *aArray, int numAllocated) {
int numElements = calculateNewSize();
if (numElements != numAllocated) {
// allocate new size
realloc(aArray, (numElements * sizeof(int));
}
return numElements;
}
现在你可以像这样调用myFunc:
int numElements;
numElements = myFunc(myArray, numElements);
使用myFunc完成后不要忘记释放内存
free(myArray);
答案 2 :(得分:1)
您可以使用向量并将新结果交换为最终结果。
#include <iostream>
#include <vector>
struct X { ~X() { std::cout << "Destruction\n"; } };
void recursive(unsigned n, std::vector<X>& result) {
// Put new_result in a scope for destruction
{
std::vector<X> new_result(1);
// Do something
// The previous result is no longer needed
std::swap(result, new_result);
}
// Next recursion
if(n) {
std::cout << "Call\n";
recursive(--n, result);
}
}
int main() {
std::vector<X> result(1);
std::cout << "Call\n";
recursive(3, result);
return 0;
}