在赋值时,我们需要先对原有对象调用析构函数。
我的析构函数实现如下:
~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 后会被优化掉。
标签:begin,函数,nullptr,析构,itr,O2 From: https://www.cnblogs.com/ss80194/p/18136092/stlite-hole1