Как внутри работает инициализация List в C++?
Есть класс Test с "говорящими конструкторами". С помощью него проверяю, когда создаются и уничтожаются экземпляры класса:
class Test {
public:
Test()
{
cout << "Test hello" << endl;
}
~Test()
{
cout << "Test bye" << endl;
}
И, соответственно, майн:
int main()
{
Test a, b, c;
list<Test> lst{ a,b,c };
cout << "\nlist size 1: " << lst.size() << endl;
lst.remove(Test());
cout << "\nlist size 2: " << lst.size() << endl;
}
Вывод такой:
Test hello
Test hello
Test hello
Test bye
Test bye
Test bye
list size 1: 3
Test hello
Test bye
Test bye
Test bye
Test bye
list size 2: 0
Test bye
Test bye
Test bye
Почему когда я добавил элементы в лист, вызвались деструкторы, но сами объекты не удалились? Почему в методе Remove() тоже вызвались деструкторы, но объекты снова не удалились, а так и остались до конца блока? Объясните, пожалуйста, как работает list внутри. Я делал отладку с заходами, но не понял организации.
Ответы (2 шт):
Добавьте
Test(const Test&)
{
cout << "Test copy" << endl;
}
и посмотрите на вывод - https://ideone.com/sqCOax
Теперь понятнее?
Давайте разбирать по строкам:
- Строка
Test a, b, c;создает 3 обьекта классаTestи выводит строки
Test hello
Test hello
Test hello
- В строке
list<Test> lst{ a,b,c };обьекты из п. 1 копируются вinitializer_list, а из него в сам список (Вы этого не видите, т.к. конструктор копирования ничего не выводит) и удаляются изinitializer_list, что Вы и видите в строках
Test bye
Test bye
Test bye
- После вывода размера следует строка
lst.remove(Test());, в которой есть создание обьекта (Test()- вызов конструктора), что Вы и видите в выводе
Test hello
- Т.к. все три обьекта в списке эквивалентны аргументу
remove, то они удаляются из списка. Мы это наблюдаем в выводе
Test bye
Test bye
Test bye
- После этого удаляется обьект, который Вы передали в
remove
Test bye
- После второго вывода размера списка, функция
mainзавершается и удаляет все обьекты, которые создала (Ваши обьектыa,bиc), что также наблюдается в выводе
Test bye
Test bye
Test bye