Назад к вопросамЧто не так с этой функцией, которая печатает
JuniorДебаггингЧасто
Что не так с этой функцией, которая печатает a / b?
#include <iostream>
void print_ratio(int a, int b) {
int* ratio = new int{0};
if (b == 0) {
return;
}
*ratio = a / b;
std::cout << *ratio << '\n';
delete ratio;
}Утечка памяти: если b равно 0, функция выходит раньше, чем выполнит delete ratio
- Ждать, что число освободится вместе с
ratio: конец области видимости обычного указателя ничего не освобождает, и число безdeleteостаётся в куче. - Ждать
delete[]:new int{0}создаёт одно число, а не массив, и одиночный объект изnewудаляют обычнымdelete.
- Почему программа не может освободить это число позже, когда
print_ratioуже вернулась? - Чем
deleteв одном деструкторе надёжнее, чемdeleteперед каждымreturn?
Исправление
Удаление нужно на каждом пути выхода из функции, и надёжнее поручить его деструктору. std::unique_ptr удалит число при любом return:
#include <iostream>
#include <memory>
void print_ratio(int a, int b) {
std::unique_ptr<int> ratio = std::make_unique<int>(0);
if (b == 0) {
return;
}
*ratio = a / b;
std::cout << *ratio << '\n';
}Здесь число можно хранить и в обычной локальной переменной int ratio: куча для него не нужна.