为什么在VC中,'delete'和'delete []'都使用标量删除析构函数?

Why in VC, both 'delete' and 'delete []' uses scalar deleting destructor?

在我对C++内存模型的理解中,只有当对象数组被new[]创建,被'delete []'删除时,才会使用标量constructor/destructor,编译器会生成一个内部for循环迭代每个元素位置。

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

但是我发现当我使用 'new' 'delete' 只操作一个元素,而不使用 '[]' 时,VC 仍然生成 'scalar deleting descturctor' 的代码用于调试版本。

所以我的问题是:

  1. 标量 constructor/destructor 不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。
  2. 所有由 new 或 new[] 创建的对象都应该有一个标量删除析构函数吗?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,应该依赖额外的删除析构函数。有什么原因吗?
  1. scalar constructor/destructor don't have to be appearing in pair, right? In my test program, I found there's only scalar deleting destructor.

我可能是错的,但我认为在构造函数方面没有任何类似于 标量删除析构函数.

  1. All objects created by new or new[], should have a scalar deleting destructor? Why one element still have this consideration, I don't see any necessity for one element's case as to process exception, stack unwinding, that should rely on an extra deleting destructor. Any reasons?

delete ptr 调用 标量删除析构函数 .
delete [] ptr 调用 向量删除析构函数

http://www.pcreview.co.uk/threads/scalar-deleting-destructor.1428390/ 找到了一个很好的答案。

It's the name that's reported for a helper function that VC writes for every class with a destructor. The "scalar deleting destructor" for class A is roughly equivalent to:

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

There's a sister function that's also generated, which is called the 'vector deleting destructor'. It looks roughly like:

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