Я прочитал один из ваших ответов (Будет ли «пустой» конструктор или деструктор делать то же самое, что и сгенерированный?). Вы написали:
«Давайте предположим, что объект типа C создан в определении конструктора A в файле .cpp, который также содержит определение struct C. Теперь, если вы используете struct A и требует уничтожения объекта A, компилятор предоставить неявное определение деструктора, как в случае выше. Этот деструктор также неявно вызовет деструктор объекта auto_ptr. И это удалит содержащийся в нем указатель, который указывает на объект C — без знания определения C ! Это появилось в файле .cpp, где определен конструктор структуры A «. Не могли бы вы объяснить мне две вещи:
1. почему деструктор А должен знать определение С?
2. Как добавление пустого деструктора А помогает ситации?
Спасибо
1) Деструктор A
должен знать, как уничтожить C
поскольку A
может содержать auto_ptr
в C
, auto_ptr
ожидается, что объекты умрут, когда вмещающий объект умрет. Следовательно, деструктор A
должен знать, как уничтожить C
,
2) Ключ в том, что определение деструктора записывается только в файл .cpp. Это означает, что вызовы деструктора связаны с объектом, скомпилированным из файла .cpp. Когда файл .cpp компилируется, он получает доступ к определению C (это то, что было написано в ответе). Следовательно, деструктор в файле .cpp может разрушать C по мере необходимости, вместо того, чтобы не разрушать C, как в случае, когда деструктор не был определен и / или определен в точке, где компилятор видел только прямое объявление class C
,
Также см
Других решений пока нет …