1. C++delete順序
在一個類中定義了一個結構體,並且聲明了這個結構體的一個對象,在這個結構體定義中又聲明了另外兩個類的對象。並且在該類(GMS)的構造函數中分別new,如下所示:
struct GMS::MDL { MM* m_pMM; TaskPlan* m_pTaskPlan; };
pimpl_ = new MDL; pimpl_->m_pMM = new MM(this); pimpl_->m_pTaskPlan = new TaskPlan(this);
在GMS類的析構函數中delete時,需要先delete結構體pimpl_中的兩個類的對象,然后才可以delete結構體pimpl_。
delete pimpl_->m_pMM; delete pimpl_->m_pTaskPlan; delete pimpl_;
若先delete結構體pimple_,然后再delete其中的兩個類的對象,會出錯。因為在delete結構體時已經把其中的兩個對象空間delete了,再delete兩個對象時其空間已經為空。
delete pimpl_; delete pimpl_->m_pMM; delete pimpl_->m_pTaskPlan;
這是錯誤的。