Насколько я понимаю, для модели памяти C++ только тогда, когда массив объектов создается с помощью new[] и удаляется с помощью 'delete []', используются скалярный конструктор/деструктор, а компилятор генерирует внутренний цикл for для повторения каждого местоположения элемента.
int main()
{
B obj;
B* pb = new B;//no scalar constructor
delete pb;//scalar deleting destructor
}
Но я обнаружил, что когда я использую «новый» «удалить» для работы только с одним элементом, без использования «[]», VC по-прежнему генерирует код для «скалярного удаления descturctor» для отладочной версии.
Итак, мой вопрос:
- скалярный конструктор/деструктор не обязательно должны появляться в паре, верно? В моей тестовой программе я обнаружил только скалярный деструктор удаления.
- Все объекты, созданные new или new[], должны иметь скалярный деструктор удаления? Почему у одного элемента все еще есть это соображение, я не вижу необходимости в случае одного элемента, чтобы обрабатывать исключение, раскручивание стека, которое должно полагаться на дополнительный деструктор удаления. Есть причины?