内存泄漏递归传递动态变量

时间:2014-01-28 09:15:55

标签: c++ recursion memory-leaks

我有一个递归函数,每次调用函数时都需要我创建一个新数组。该函数还需要先前创建的数组:

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;

因为我只能在再次调用该函数后添加它。我该如何解决这个问题?

3 个答案:

答案 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;
}