Я пытаюсь реализовать быстрый способ применения силовой работы на матрице в C++ (O (logn)). Поэтому у меня было определить умножение и электропитанию, как вы можете увидеть нижеУтечка памяти C++ в рекурсии
int ** matrixmul(int ** A, int ** B, int n) {
int ** result = (int **) calloc(sizeof(int *), n);
for (int i = 0; i < n; ++i)
result[i] = (int *) calloc(sizeof(int), n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int sum = 0;
for (int k = 0; k < n; ++k) {
sum += A[i][k] * B[k][j];
}
result[i][j] = sum;
}
}
return result;
}
int ** matrixpow(int ** m, int n, int p) {
if (p == 1) {
return m;
} else if (p % 2 == 0) {
return matrixmul(matrixpow(m, n, p/2), matrixpow(m, n, p/2), n);
} else {
return matrixmul(matrixmul(matrixpow(m, n, (p - 1)/2), matrixpow(m, n, (p - 1)/2), n), m, n);
}
}
Функция matrixmul не является универсальным для умножения матриц, это только для тех квадратов.
Мой вопрос, если есть способ модификации этих функций, так что я не буду иметь никаких утечек памяти, потому что программа теряет память на каждом рекурсивном вызове
Считаете ли вы использование 'std :: vector' over 'int *'? –
fredoverflow
'int ** result = (int **) calloc (sizeof (int *), n);' с каждым из этих вызовов вы теряете результирующий указатель предыдущего вызова. Если бы вы решили использовать 'realloc()' и передать результаты распределения в качестве параметра? –
Вы должны создать временные переменные для хранения результатов matirxpow, передать их в 'matrixmul' и освободить их после' matrixmul' в обоих предложениях 'else'. – Kimi