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

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

本文关键字:delete 析构函数 标量 删除 VC 为什么      更新时间:2023-10-16

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

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

但是我发现当我使用'new' 'delete'来操作一个元素时,不使用'[]',VC仍然为调试版本生成'标量删除描述符'的代码。

我的问题是:

  1. 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。
  2. 所有由new或new[]创建的对象都应该有一个标量删除析构函数?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,这应该依赖于一个额外的删除析构函数。任何原因吗?
  1. 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。

我可能是错的,但是我不认为在构造函数端有任何类似于标量删除析构函数的东西。

  • 所有由newnew[]创建的对象都应该有一个标量删除析构函数?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,这应该依赖于一个额外的删除析构函数。任何原因吗?
  • 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);
    }