Привет, комментарий @ 1201ProgramAlarm абсолютно прав, однако, я подумал сам, как бы я go о "спасении" программы (а) с минимальными усилиями, (б), чтобы получить правильную версию и (c) очень сильно с точки зрения исходной версии.
Итак, вот новая main.cc
версия (Person.h
, Person.cc
менять не нужно):
#include "Person.h"
#include <map>
using namespace std;
multimap <string, Person *> personMap;
multimap <string, Person *>::iterator counter;
void add()
{
string name;
int age;
cout << "Please enter the name of the person: ", cin >> name;
cout << "Please enter the age of the person: ", cin >> age;
personMap.insert({ name, new Person(name, age) });
}
void find()
{
string personToBeFound;
cout << "Who do you wish to find, friend: ", cin >> personToBeFound;
for (counter = personMap.begin(); counter != personMap.end(); counter++)
{
if (counter->first == personToBeFound)
{
cout << "\nName: " << counter->first
<< " Age: " << counter->second->getAge() << endl;
}
else
{
cout << "Error 404, person does not exist..." << endl;
}
}
}
int main(int argc, char* argv[])
{
int menuChoice = -1;
while (menuChoice != 0)
{
cout << "\nPlease enter: "
"\n1 - to add a person "
"\n2 - to find a person"
"\n0 - to quit\n" << endl;
cin >> menuChoice;
switch(menuChoice)
{
case 1:
add();
break;
case 2:
find();
break;
case 0:
menuChoice = 0;
break;
}
}
// -- How to go about clearing the heap? --
for (counter = personMap.begin(); counter != personMap.end(); counter++)
{
if (counter->second) {
delete counter->second;
counter->second = nullptr;
}
}
}
Я скомпилировал, используя g++ -o main Person.cc main.cc
. С уважением, М.
Обновление после этого вопроса :
Почему бы мне просто не удалить ключи вместо значений multimap <string, Person *>
записей?
Ответ :
Я просто хотел показать, что можно сделать для предотвращения осиротевших Person
объектов в куче, когда multimap
вышел (локальной) области и, таким образом, будет автоматически уничтожен системой C++
. Более конкретно:
(a) Как и в C
, то, что malloc
-ed, должно быть снова free
-ed позже, эквивалентно истинно в C++
: что new
-ed должен быть delete
-ed позже. Это лучшая практика для предотвращения утечек памяти в долгосрочной перспективе.
(b) Теперь вернемся к нашему multimap <string, Person *>
. Здесь ключи string
с, а значения указатели на Person
объектов. Эти Person
указатели - единственный оставшийся способ удержать соответствующие Person
объекты , выделенные в куче при вызовах функции add()
.
(c) В нашем случае вся программа будет остановлена в любом случае после автоматического уничтожения multimap
, поэтому delete
-ing Person
объектов с использованием этого дополнительного for
- l oop здесь не так важен, потому что Person
объекты, остающиеся в куче, собираются сборщиком мусора операционной системой после завершения соответствующего процесса, так или иначе.