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