Подтвердить что ты не робот

Является ли этот деструктор С++ избыточным?

Я получил некоторый код С++ с различными структурами, определенными следующим образом:

typedef struct _someStruct_ {
   std::string someString; 
   std::vector<std::string> someVectorOfStrings;
   int  someOtherStuff;

   ~_someStruct_()
   {
      someString.clear();
      someVectorOfStrings.clear(); 
   }
} someStruct; 

Является ли деструктор здесь полностью избыточным - если структура должна была быть разрушена деструктором по умолчанию, не будут ли разрушены никакие строки, векторы и т.д.?

Если бы я написал код, я бы не подумал о добавлении явного деструктора здесь - я бы просто позволил компилятору справиться с этим.

Как я понимаю, единственный раз, когда вам может понадобиться создать свой собственный деструктор в структуре, - если какой-либо из членов структур содержит указатели на данные, которые могут потребоваться очистка, или если какая-то дополнительная функциональность (например, для отладки, регистрация, когда структура удаляется).

Мне что-то не хватает - есть ли причина, по которой строки и векторы были явно очищены в деструкторе? Мое подозрение состоит в том, что человек, который послал мне это, действительно программист на C (ср. Typedef), который попытался превратить некоторый C-код в С++.

4b9b3361

Ответ 1

Да, деструктор полностью избыточен.

Как вы сами сказали, у кода есть другие предупреждения. Использование typedef struct, например, не имеет никакого смысла в С++, его избыточности, как пустой деструктор: код был написан кем-то с предельным пониманием С++, там должно быть больше gotchas (во-первых, имя класса недопустимо из-за ведущего подчеркивания в глобальной области).

Ответ 2

На самом деле это хуже, чем просто использование неявного деструктора.

Имея явный деструктор, компилятор не предоставит вам неявный механизм перемещения!

Ответ 3

Деструктор почти полностью избыточен.

Это делает три вещи.

Сначала он блокирует автоматическое создание конструкторов копирования и перемещения и назначения. Это... не может быть хорошо. Но, возможно, это желательно. Это, однако, не то же самое, что не быть там.

Во-вторых, он изменяет порядок очистки элемента. Буфер, удерживаемый строкой, очищается, затем каждый буфер, удерживаемый строками в векторе, уничтожается, а строка, содержащая их, уничтожается, тогда вектор с буфер неиспользуемой памяти уничтожается (возвращает память), а затем пустая строка уничтожается.

С деструктором по умолчанию порядок буферов векторной строки уничтожается, тогда память для векторных строк возвращается при уничтожении вектора, , а затем строка уничтожается вместе с ее буфером вернулся.

Вы можете обнаружить это с соответствующими перегрузками для операторов new и delete, или если вы использовали пользовательские распределители.

Наконец, такие деструкторы иногда легче отлаживать, так как вы можете пройти через них.

Однако есть вероятность, что ни один из этих тонких эффектов не был предназначен разработчику, который написал этот код.