为什么在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' 的代码用于调试版本。
所以我的问题是:
- 标量 constructor/destructor 不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。
- 所有由 new 或 new[] 创建的对象都应该有一个标量删除析构函数吗?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,应该依赖额外的删除析构函数。有什么原因吗?
- scalar constructor/destructor don't have to be appearing in pair, right? In my test program, I found there's only scalar deleting destructor.
我可能是错的,但我认为在构造函数方面没有任何类似于 标量删除析构函数.
- 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);
}
在我对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' 的代码用于调试版本。
所以我的问题是:
- 标量 constructor/destructor 不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。
- 所有由 new 或 new[] 创建的对象都应该有一个标量删除析构函数吗?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,应该依赖额外的删除析构函数。有什么原因吗?
- scalar constructor/destructor don't have to be appearing in pair, right? In my test program, I found there's only scalar deleting destructor.
我可能是错的,但我认为在构造函数方面没有任何类似于 标量删除析构函数.
- All objects created by
new
ornew[]
, 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); }