Чтобы сделать вашу домашнюю работу, я бы предложил больше узнать об указателях, операторах new / delete, операторах new [] / delete [] (не путать с операторами new / delete) и создании / копировании объектов / конструкторах / деструкторов. Это базовые возможности C ++, и ваша задача заключается в следующем.
Чтобы указать некоторые направления:
1) Когда вы динамически распределяете объект следующим образом
MyType* p = new MyType;
или
MyType* p = new MyType(constructor_parameters);
вы получаете указатель p
на созданный объект (new
выделяет память для одного объекта типа MyType
и вызывает конструктор этого объекта).
После того, как ваша работа с этим объектом закончена, вы должны позвонить
delete p;
delete
вызывает деструктор объекта, а затем освобождает память. Если вы не позвоните delete
ваша память просочилась. Если вы вызываете его более одного раза, поведение не определено (вероятно, повреждение кучи, которое может привести к сбою программы - иногда в очень странный момент).
2) Когда вы динамически распределяете массив следующим образом
MyType* p = new MyType[n];
вы получаете указатель p
на массив n
созданного объекта, расположенного последовательно в памяти (new[]
выделяет один блок памяти для n
объектов типа MyType
и вызовов конструкторы по умолчанию для каждого объекта).
Вы не можете изменить количество элементов в этом динамическом массиве. Вы можете только удалить его.
После окончания работы с этим массивом вам нужно вызвать
delete[] p; // not "delete p;"
delete[]
вызывает деструктор каждого объекта в массиве, а затем освобождает память. Если вы не позвоните delete[]
, у вас утечка памяти. Если вы вызываете его более одного раза, поведение не определено (вероятно, сбой программы). Если вы вызываете delete
вместо delete[]
, поведение не определено (вероятно, деструктор вызывается только для первого объекта, а затем пытается освободить блок памяти - но это может быть что угодно).
3) Когда вы назначаете структуру / класс, вызывается operator=
. Если у вас нет operator=
, явно определенного для вашей структуры / класса, то генерируется неявный оператор = (он выполняет присваивание каждого нестатического члена вашей структуры / класса).