Формат деструктора C ++ - PullRequest
       11

Формат деструктора C ++

2 голосов
/ 02 февраля 2011
 void arrayList<T>::erase(int theIndex) {
            // valid index, shift elements with higher index
            copy(element + theIndex + 1, element + listSize, element + theIndex);

            element[--listSize].~T(); // invoke destructor 
        }

Код element[--listSize].~T() выглядит странно. Он используется для удаления динамически размещенного элемента. Кто-нибудь знает, почему мы можем использовать этот синтаксис?

EDIT

Проблема решена.

Ответы [ 5 ]

5 голосов
/ 02 февраля 2011

Это было бы полезно, если вы выделили память для elements[i], используя оператор placement new.См. Что такое "новое размещение" и зачем мне его использовать? для получения подробной информации.

3 голосов
/ 02 февраля 2011

Кто-нибудь знает, почему мы можем использовать этот синтаксис?

Мы используем его для вызова деструктора объекта, выделенного с помощью размещения нового , как правило.Смотрите также эта страница .

2 голосов
/ 02 февраля 2011

Элемент кода [- listSize]. ~ T () выглядит странно. Он используется для удаления динамически размещенного элемента. Кто-нибудь знает, почему мы можем использовать этот синтаксис?

Используется для уничтожения этого объекта; это, вероятно, то, что вы имели в виду, но "удалить" имеет другие значения в C ++. Это необходимо сделать, если вы создаете каждый элемент вручную.

Вы можете использовать этот синтаксис, потому что он специально разрешен языком. Противоположностью ручного вызова деструктора является размещение нового.

2 голосов
/ 02 февраля 2011

Явный вызов деструктора полезен в тех случаях, когда вы хотите должным образом уничтожить объект, но не освобождать его память, используя delete (или delete []) напрямую, например, в каком-то специальном менеджере памяти. Это не должно использоваться очень часто, хотя.

2 голосов
/ 02 февраля 2011

Да, вы правы, они явно вызывают деструктор ...

Однако вы можете исправить все проблемы с этой реализацией, выбрасывая ее и используя std::vector или std::list вместо!

...