1. 程式人生 > >c++中類物件直接作為函式引數所引起的問題。

c++中類物件直接作為函式引數所引起的問題。

這兩天在寫一個視訊轉換的程式,將H263/264編碼的視訊封裝成mov格式,用c++實現。

Wiki上說Apple的mov格式是典型的over engineering,設計的非常複雜,各種資訊使用atom原子封裝,一個atom裡面遞迴地巢狀著另外一個atom,atom的種類有幾十種之多,用類實現是再好不過了。

發完牢騷了,言歸正傳,以前沒怎麼做過c++的東西,或者更本質地說,沒怎麼寫過面向物件的程式,所以很2B地將類物件做為函式的引數,好了,問題來了。

現在有一個TMovMediaFile類,用來儲存生成mov檔案需要的各種資訊,在新生成的mov檔案中需要重新計算媒體資料的位置,即chunkOffset,chunk是儲存媒體資訊的資料塊。現在寫了這麼個函式,來更新chunkOffset

Bool updateChunkOffset(int changeValue,TMovMediaFiletmov)

編譯通過,執行,報錯,double free or corruption.

TMovMediaFile類的解構函式被執行了兩次,c++裡面函式引數傳值和傳引用的區別一下體現出來了。

如果是上面的寫法,那麼程式會建立一個tmov的臨時副本,函式執行完了,就會執行TMovMediaFile類的解構函式,因為這個副本只是一些指標,指向一些new申請的地址空間,所以原先的TMovMediaFile物件tmov等於也是被析構了,函式的形參和實參指向的是同一片new申請到的記憶體,那麼等主程式退出,再次執行tmov的解構函式就會發生重複delete的錯誤。

使用TMovMediaFile&做傳引用呼叫,就不會有這樣一個問題,update函式執行完畢不會對tmov進行析構,因為tmov物件在main中建立,只有main執行完了,才會呼叫它的解構函式,所以不會發生重複析構的問題。

PS:在一個比較長的程式裡面找重複析構的地方還是很費勁啊,面對c++,我只是菜鳥。