問題:給出如下CMyString的聲明,要求為該類型添加指派運算符函數。
當我們完整地考慮了上述幾方面之後,我們可以寫出如下的代碼:
面試官會提醒我們在前面的函數中,顯示地用delete釋放自身m_pData的記憶體。同時我們也會在析構函數中用delete釋放自身m_pData的記憶體。如果這個類型中添加新的指針成員變量,那麼我們至少需要做兩處修改,即同時在析構函數和這個指派運算符函數裡添加一條delete語句來釋放新指針所指向的記憶體。一個改動需要在代碼中多個地方修改代碼,通常是有安全隐患的。通常我們會記得在析構函數裡用delete釋放指針成員變量,但未必每次都記得到指派運算符函數來添加代碼釋放記憶體。
更好的辦法在複制運算符函數中利用析構函數自動釋放執行個體已有的記憶體。下面是這種思路的參考代碼:
在這個函數中,我們定義一個臨時執行個體strTemp,并把strTemp的m_pData指向目前執行個體(*this)的m_pData。由于strTemp是個局部變量,但程式員運作到if的外面是也就出了的該變量的域,就會自動調用strTemp的析構函數,就會把strTemp.m_pData所指向的記憶體釋放掉。由于strTemp.m_pData指向的記憶體就是目前執行個體之前m_pData的記憶體。這就相當于自動調用析構函數釋放目前執行個體的記憶體。如果新增加指針成員變量,我們隻需要在析構函數裡正确地釋放,而不需要對指派運算符函數做任何修改。