У меня есть рекурсивная функция, которая требует, чтобы я создавал новый массив каждый раз, когда вызывается функция. Для функции также требуется массив, который был ранее создан:
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;
так как я могу только добавить, что после вызова функции снова. Как я могу это решить?
Вы можете решить эту проблему, используя динамическое распределение памяти.
// 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);
Попробуйте что-нибудь вроде
void myFunc(int* prevArray)
{
int newSize;
...newArray = new int[newSize];
myFunc(newArray);
delete[] newArray;
}
или еще лучше использовать std :: unique_ptr для управления памятью newArray. Таким образом, вы будете придерживаться эмпирического правила относительно динамической памяти - что у него должен быть один владелец, ответственный за распределение и освобождение.
Вы можете просто использовать вектор и поменять новый результат на конечный результат.
#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;
}
delete[] newArray;
после звонка наmyFunc
?