Утечка - это просто боковое шоу
Не должно быть никакой утечки.Правильные вещи освобождаются, а ошибка заключается в том, что одна вещь выделяется без необходимости.
Посмотрите, как m_noOfSubjects
используется после выделения массива:
read(*Sch.m_noOfSubjects, 2, 50, "Invalid Number of subjects, 2<=ENTRY<=50\nRedo Entry: ");
и
Sch.m_subjects = new int[*Sch.m_noOfSubjects];
и
for (int i = 0; i < *Sch.m_noOfSubjects; i++)
Все используют ровно одно значение: самое первое.Это не поведение массива.Это поведение единственного int
.
m_noOfSubjects
не должно быть указателем на массив или int
или чем-то в этом роде.Это должно быть просто глупо, ol 'int
.
В определении School
заменить
int * m_noOfSubjects;
на
int m_noOfSubjects;
, затем удалитьвыделение
Sch.m_noOfSubjects = new int[50];
и, наконец, устранение всех разыменований.Например,
read(*Sch.m_noOfSubjects, 2, 50, "Invalid Number of subjects, 2<=ENTRY<=50\nRedo Entry: ");
^ remove
и
Sch.m_subjects = new int[*Sch.m_noOfSubjects];
^ remove
и
for (int i = 0; i < *Sch.m_noOfSubjects; i++)
^ remove
Процесс мышления по отслеживанию и предотвращению утечек памяти (оригинальный ответ)
Отчетговорит, что один блок из 200 байтов потерян.Вы можете посмотреть в своем коде, где вы выделяете 200 байтов, и исследовать более внимательно.Например, если int
- 32 бита, Sch.m_noOfSubjects = new int[50];
соответствует счету 32 бита = 4 байта.4 * 50 = 200.
Давайте проследим за m_noOfSubjects
и убедимся, что он правильно управляется.
one CTRL + F позже ...
Конечно, я нигде не могу найти delete
из m_noOfSubjects
в данном коде.
Как мы можем это исправить?std::vector<int>
следует использовать для решения такой проблемы.vector
присматривает за всеми средствами управления ресурсами от вас до выделения ресурсов и добавляет правильную обработку копирования и назначения одновременно.
Тем не менее, я подозреваю, что это задание должно научить вас RAII .В этом случае вам нужно добавить конструктор и деструктор (а также конструктор копирования и оператор присваивания, потому что если вам нужен деструктор, вам почти всегда нужен специальный код для обработки копирования ) вSchool
класс.Не выделяйте ресурсы School
в какой-либо бесплатной функции read
, которая не заботится о здоровье и благополучии класса School
.School
должен следить за собой, выделяя хранилище в своем конструкторе или в своем собственном методе ввода.Позже деструктор гарантирует, что все ресурсы School
будут освобождены, как только School
выйдет из области видимости.Все, что вам нужно сделать, это убедиться, что School
выходит из области видимости.