Loading

析构函数与 -O2 优化的一个问题

在赋值时,我们需要先对原有对象调用析构函数。

我的析构函数实现如下:

~vector() 
	{
		for(ptr* itr=begin_p;itr!=finish_p;itr++)
		{
			delete *itr;
		}
		delete[] begin_p;
		begin_p=nullptr;finish_p=nullptr;end_p=nullptr;
	}

不使用 -O2 优化,程序运行正常,调用完析构函数后 this->begin_p 被设为了 nullptr。但在使用 -O2 优化后,begin_p 在调用完析构函数后保留原值,并没有被设为 nullptr,导致 RE。

原因:

当调用析构函数时,可以视作该对象已经来到了生命末期,该对象不会在被使用。此时对于对象内部变量值的修改被视作没有意义的 UB 行为,在开 -O2 后会被优化掉。

posted @ 2024-04-15 15:40  SS80194  阅读(25)  评论(0)    收藏  举报