在我对C ++内存模型的理解中,只有当对象数组由new []创建并被'delete []'删除时,才使用标量构造函数/析构函数,编译器生成内部for循环以迭代每个元素位置。
int main()
{
B obj;
B* pb = new B;//no scalar constructor
delete pb;//scalar deleting destructor
}
但我发现当我使用'new''delete'来操作一个元素而不使用'[]'时,VC仍会为调试版本的'标量删除descturctor'生成代码。
所以我的问题是:
答案 0 :(得分:1)
- 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除了析构函数。
醇>
我可能错了,但我不认为构造函数方面有任何类似于标量删除析构函数的内容。
- 醇>
new
或new[]
创建的所有对象都应该有一个标量删除析构函数?为什么一个元素仍然有这个考虑因素,我没有看到任何一个元素处理异常,堆栈展开的情况,这应该依赖于额外的删除析构函数。有什么原因吗?
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); }