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

时间:2016-09-02 01:55:11

标签: c++ heap destructor scalar

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

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

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

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

  
      
  1. 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除了析构函数。
  2.   

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

  
      
  1. newnew[]创建的所有对象都应该有一个标量删除析构函数?为什么一个元素仍然有这个考虑因素,我没有看到任何一个元素处理异常,堆栈展开的情况,这应该依赖于额外的删除析构函数。有什么原因吗?
  2.   

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