为什么在 VC 中,'delete' 和 'delete []' 都使用标量删除析构函数?
Why in VC, both 'delete' and 'delete []' uses scalar deleting destructor?
在我对c++内存模型的理解中,只有当对象数组由new[]创建,并由'delete[]'删除时,才会使用标量构造函数/析构函数,编译器会生成一个内部for循环来迭代每个元素的位置。
int main()
{
B obj;
B* pb = new B;//no scalar constructor
delete pb;//scalar deleting destructor
}
但是我发现当我使用'new' 'delete'来操作一个元素时,不使用'[]',VC仍然为调试版本生成'标量删除描述符'的代码。
我的问题是:
- 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。 所有由new或new[]创建的对象都应该有一个标量删除析构函数?为什么一个元素仍然有这个考虑,我不认为一个元素的情况有任何必要处理异常,堆栈展开,这应该依赖于一个额外的删除析构函数。任何原因吗?
- 标量构造函数/析构函数不必成对出现,对吧?在我的测试程序中,我发现只有标量删除析构函数。
我可能是错的,但是我不认为在构造函数端有任何类似于标量删除析构函数的东西。
- 所有由
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); }
相关文章:
- 析构函数和'delete'之间的区别
- 析构函数中的"delete this"
- 析构函数是否会自动调用 delete[] C++?
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- 我们什么时候应该在 C++ 中将析构函数声明为 =DELETE
- 在析构函数中使用 delete[]:为 RtlValidateHeap 指定的地址无效
- delete[]调用析构函数时出现内存错误
- 虚拟析构函数和delete关键字
- Delete导致基类中的虚拟析构函数出现内存错误
- c++析构函数调用一个delete运算符
- 析构函数上的 =delete 如何阻止堆栈分配
- 如何将指针与delete关键字和析构函数一起使用
- 析构函数调用delete函数时程序崩溃
- 使用delete调用析构函数
- boost::ptr_vector with arrays:我能确定它的析构函数调用delete[]而不是delete吗
- 当delete操作符释放内存时,我为什么需要析构函数
- QList析构函数行为-对列表中的指针调用delete/free()
- 是否有可能在c++中调用delete时阻止析构函数运行?
- c++中delete和调用析构函数的区别是什么?