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

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

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

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

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

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

0

Решение

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

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

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

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

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

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

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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]