是否可以从其析构函数内的指针访问已破坏的对象是否定义为行为?是否保证对象仍位于该指针位置并且可以访问?例如,在下面的代码中,我销毁了a1,并在其析构函数内访问了指向a1的a2中的a1。
#include <iostream>
class A
{
public:
A(int* i) : m_i(i) {}
~A();
int* m_i;
};
A* a1;
A* a2;
int x = 0;
A::~A()
{
*a2->m_i = 1;
}
int main()
{
a1 = new A(&x);
a2 = a1;
delete a1;
std::cout << x << std::endl;
return 0;
}
如果expression不是非空指针,并且释放函数也不是销毁性删除(自C ++ 20起),则delete表达式将为销毁的对象或销毁的数组的每个元素调用析构函数(如果有)。 (从数组的最后一个元素到第一个元素)。
之后,无论是否有析构函数引发异常,delete表达式都会调用释放函数:运算符delete(用于表达式的第一版)或运算符delete [](用于表达式的第二版)
https://en.cppreference.com/w/cpp/language/delete
因此析构函数将在释放之前被调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句