Это продолжение вопроса, который я задал ранее сегодня относительно назначения прямого вызова деструктора класса.
Я создаю свой собственный Список для назначения.Я перегрузил назначение, квадратные скобки, входящие и исходящие потоковые операторы и имею базовые функции добавления, удаления и печати на экран.
Мой следующий шаг - удаление списка и освобождение памяти всех его функций.узлы, с которыми у меня возникают проблемы.
У меня есть список, записывающий на экран свое текущее состояние после выполнения своих операций, следующим образом:
void main()
{
// Create instance of list
List aList(true);
List bList(true);
aList.Add(1);
aList.Add(2);
bList.Add(2);
cout << "aList: " << aList;
cout << "bList: " << bList;
aList = bList;
cout << "aList: " << aList;
cout << "bList: " << bList;
aList.Add(3);
cout << "aList: " << aList;
cout << "bList: " << bList;
int i = 0; cin >> i;
}
Вот мой перегруженный выходной поток:
ostream &operator<<(ostream &stream, List theList)
{
stream << "There are " << theList._totalNodes << " nodes in the list." << endl;
for(int i = 0; i < theList._totalNodes; i++)
{
stream << "Node #" << i << " holds the data: " << theList[i] << endl;
}
return stream;
}
Когда вы используете это окно командной строки, под ним также напечатано "Destructor call".
Деструктор списка:
List::~List()
{
cout << "Destructor called" << endl;
// List::Destroy();
}
Перегруженоператор присваивания также, кажется, вызывает деструктор, что меня не удивляет.Однако другие делают.
List &List::operator=(List &aList)
{
// Make sure not the same object trying to be copied
if(this != &aList)
{
// Perform deep copy
// Delete old pointers in redundant list, only if they exist already
if(_head)
{
delete _head, _tail, _current, _del;
_totalNodes = 0; // Reset total nodes
}
// Now set new pointers copied from other list
_head = NULL;
_tail = _head;
_current = _head;
_del = _head;
// Now loop through all nodes in other list and copy them to this
// Reset pointer in other list
aList.Reset();
for(int i = 0; i < aList._totalNodes; i++)
{
Add(aList.Current()->_data);
aList.Next();
}
// Reset other list's pointer
aList.Reset();
Reset(); // Reset our pointer
}
return *this; // Return for multi assignment
}
У меня также есть деструктор для записи списка «Разрушитель вызван», когда он вызывается, и заметил, что он вызывается после каждого использования одного из его методов.
Почему это?Я предположил, что деструктор вызывается, когда объект больше не нужен, то есть удаляется.
Кроме того, при переходе по моему коду я заметил, что при удалении указателя адрес памяти, на который он указывает, не будетаннулирована.Нужно ли вручную обнулять указатель после его удаления?