【问题标题】:Why in VC, both 'delete' and 'delete []' uses scalar deleting destructor?为什么在 VC 中,'delete' 和 'delete []' 都使用标量删除析构函数?
【发布时间】:2017-01-10 00:41:36
【问题描述】:

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

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

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

所以我的问题是:

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

【问题讨论】:

    标签: c++ heap-memory destructor scalar


    【解决方案1】:
    1. 标量构造函数/析构函数不必成对出现,对吗?在我的测试程序中,我发现只有标量删除析构函数。

    我可能错了,但我认为构造函数方面没有任何类似于标量删除析构函数的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2011-01-12
      • 2014-11-22
      • 2011-03-23
      • 2018-06-02
      • 2017-02-06
      • 2011-06-11
      相关资源
      最近更新 更多