C++ Операторы, перегрузка операций
Мне сказали , что не корректная работа с памятью в данном операторе, кто подскажет в чём та самая "не корректная работа"?
Matrix& operator /(Matrix& obj) {
int k = 0;
float** arr1;
float** arr2 = obj.getArr();
float s1, s2;
if (N > obj.getN()) {
N = obj.getN();
}
if (M > obj.getM()) {
M = obj.getM();
}
for (int i = 0; i < N; i++) {
s1 = sr(arr[i], M);
s2 = sr(arr2[i], M);
if (s1 > s2) {
k++;
}
}
if (k > 0) {
int z = 0;
arr1 = new float* [k];
for (int i = 0; i < k; i++) {
arr1[i] = new float[M];
}
for (int i = 0; i < N; i++) {
s1 = sr(arr[i], M);
s2 = sr(arr2[i], M);
if (s1 > s2) {
arr1[z] = arr[i];
z++;
}
}
//print(arr2, k, M);
}
else {
arr1 = arr2;
k = obj.getN();
M = obj.getM();
}
Matrix* x = new Matrix(arr1, k, M);
for (int i = 0; i < N; i++) {
delete[]arr1[i];
}
delete[]arr1;
return *x;
}
Ответы (1 шт):
Как минимум, вы создаете динамически объект
Matrix* x = new Matrix(arr1, k, M);
после чего возвращаете его как
return *x;
Т.е. создается и возвращается копия объекта. Указатель на исходный объект теряется, и вы получаете утечку памяти.
Возможно, есть и другие неприятности, но маловато кода (например,
float** arr2 = obj.getArr();
кто здесь владеет выделенной памятью? кто должен ее освобождать? Без полного кода непонятно), а этот возврат - первое, что просто бросается в глаза...
Кстати, судя по
arr1 = arr2;
в ветви else с последующим освобождением arr1 - если проходит первая ветвь, arr2 так и остается не освобожденным - очень похоже, что и тут утечка памяти...