2015-02-09 2 views
1

Предположим, у меня есть самостоятельно определить вектор класса и деструктор вектора класса определяется, как показано ниже,Деструктор по умолчанию для указателей?

~vector(void) { 
     for (uint64_t i = 0; i<len_elem; i++) { //destruct each elem 
       front[i].~T(); 
     } 
     ::operator delete(head); 
     head = nullptr; 
     capacity = 0; 
} 

В моем понимании, это деструктор отлично работает в большинстве случаев. Однако, если вектор равен vector<vector*> myVec, правильно ли будет выполняться код в деструкторе? Чтобы быть конкретным, правильно ли вызовет дескриптор векторного класса front[i].~T();?

+2

Одним словом: нет. Что касается «правильного» или нет, это зависит от варианта использования. –

+0

Указатели не имеют деструкторов, но вы можете вызвать деструктор на объект с помощью указателя (используя оператор 'delete'). –

ответ

4

TLDR: Ваш код в порядке.

Долгий ответ: Да и нет.

front[i].~T() «правильно вызовет деструктор для указателя *». Однако «деструктор» указателя ничего не делает. Так что этот код правильно ничего не делает.

Если вы хотите бесплатно вещи, на которые указывают указатели, это совсем другая вещь. Самое простое в этом случае - вместо этого использовать vector<std::unique_ptr<int>> или что-то еще, так что этот деструктор вызовет деструкторы unique_ptr и те деструкторы освободят память.

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

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

+3

Стандартные последовательные контейнеры не определяют порядок уничтожения (который я знаю), поэтому любой такой «придирчивый класс» будет багги-классом. –

+0

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

+3

@elexonics: общепринятое соглашение о том, что порядок уничтожения должен быть точным обратным порядку строительства. За этим соглашением строго следует язык C++ в отношении локальных объектов, статических объектов, членов класса, необработанных массивов и т. Д. По этой причине может иметь смысл придерживаться этого соглашения и с вашими контейнерами. Однако 'std :: vector', очевидно, не гарантирует этого. – AnT