Почему в VC как «удалить», так и «удалить []» используется скалярный деструктор удаления?

Насколько я понимаю, для модели памяти C++ только тогда, когда массив объектов создается с помощью new[] и удаляется с помощью 'delete []', используются скалярный конструктор/деструктор, а компилятор генерирует внутренний цикл for для повторения каждого местоположения элемента.

int main()
{
    B obj;
    B* pb = new B;//no scalar constructor
    delete pb;//scalar deleting destructor
}

Но я обнаружил, что когда я использую «новый» «удалить» для работы только с одним элементом, без использования «[]», VC по-прежнему генерирует код для «скалярного удаления descturctor» для отладочной версии.

Итак, мой вопрос:

  1. скалярный конструктор/деструктор не обязательно должны появляться в паре, верно? В моей тестовой программе я обнаружил только скалярный деструктор удаления.
  2. Все объекты, созданные new или new[], должны иметь скалярный деструктор удаления? Почему у одного элемента все еще есть это соображение, я не вижу необходимости в случае одного элемента, чтобы обрабатывать исключение, раскручивание стека, которое должно полагаться на дополнительный деструктор удаления. Есть причины?

person Troskyvs    schedule 02.09.2016    source источник


Ответы (1)


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

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

  1. Все объекты, созданные new или new[], должны иметь скалярный деструктор удаления? Почему у одного элемента все еще есть это соображение, я не вижу необходимости в случае одного элемента, чтобы обрабатывать исключение, раскручивание стека, которое должно полагаться на дополнительный деструктор удаления. Есть причины?

delete ptr вызывает деструктор удаления скаляра.
delete [] ptr вызывает деструктор удаления вектора.

Очень хороший ответ можно найти на http://www.pcreview.co.uk/threads/scalar-deleting-destructor.1428390/.

Это имя сообщается для вспомогательной функции, которую VC пишет для каждого класса с деструктором. «Скалярный деструктор удаления» для класса A примерно эквивалентен:

void scalar_deleting_destructor(A* pa)
{
   pa->~A();
   A::operator delete(pa);
}

Также сгенерирована родственная функция, которая называется «деструктор удаления вектора». Это выглядит примерно так:

void vector_deleting_destructor(A* pa, size_t count)
{
   for (size_t i = 0; i < count; ++i)
      pa.~A();
   A::operator delete[](pa);
}
person R Sahu    schedule 02.09.2016