看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我現在在看Source code,其中這邊看不懂...QQ 麻煩前輩指點了 -------------------- 問題一開始先說明有一個class名為Timebuffer,其有一個template T,如下網址 Timebuffer http://codepad.org/2SALFOxp 然後在其他class裡面建立一個Timebuffer成員,如下 TimeBuffer<FetchStruct> fetchQueue; (1) 隨後在同個class裡面有叫用到Timebuffer 裡面的member function,如下 fetchQueue.advance(); 而這個function可以在上面Timebuffer 網頁中第179行看到 其中第187行 (reinterpret_cast<T *> (index[ptr]) ) -> ~T(); (2) 這邊有將一個index[ptr]內容強轉態為 T *型態 而這個型態可以看到上面(1)的地方,是為一個FetchStruct的東西 可以看到 http://codepad.org/XXtdcI5S 裡面的第93行 typedef DefaultFetchDefaultDecode<Impl> FetchStruct; 可以知道他前身是DefaultFetchDefaultDecode, 而這個又可以在http://codepad.org/W3Ql7bgu 第60行的地方找到 template<class Impl> struct DefaultFetchDefaultDecode { 可以發現他是一個structure,那麼... 回到上面(2)的地方, 他既然強轉態成 T *,也就是DefaultFetchDefaultDecode structure型態 那為什麼會有解構子 ~T() 呢? 亦或是,我也在該個structure中看不到解構的動作? 不知道上述說明哪裡不正確 在這方面觀念很薄弱,希望前輩們可以指點指點!! 謝謝 :) 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.187.212 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1428147580.A.6D3.html
PkmX: 看完還是不懂你的問題在哪 建議你可以去看一下placement new 04/04 19:55
PkmX: 相關的東西 (自己要一塊未初始化的記憶體在上面建構和解構) 04/04 19:56
PkmX: 另外他的DefaultFetchDefaultDecode<Impl>有compiler 04/04 19:57
PkmX: 自動產生的default destructor 04/04 19:57
我看這邊也看的有點疼 placement new我也不知道是什麼,立馬來看一下 而自動產生的default destructor的確是有 我用GDB去看,有下面這一行 DefaultFetchDefaultDecode<O3CPUImpl>::~DefaultFetchDefaultDecode (this=0x59bef40, __in_chrg=<optimized out>) at build/ARM/cpu/o3/comm.hh:60 但是原始的地方沒有定義destructor,那怎麼可以執行 ~T() 還是這裡的 ~DefaultFetchDefaultDecode 不等於 ~T() 呢? 謝謝~ ※ 編輯: smilekerker (140.116.187.212), 04/04/2015 20:18:54
LPH66: dtor 在原始碼沒有時會自動生成一個, 就是 gdb 看到的那個 04/04 20:34
smilekerker: 我知道dtor沒有寫的話,compiler會產生一個,但這個 04/04 20:43
smilekerker: 自動產生的dtor我們不能直接指定去使用吧? 像~T()? 04/04 20:44
LPH66: 所以上面才請你去找 placement new 的東西, 這跟那有關 04/04 20:48
LPH66: 簡單說就是 placement new 因為空間索取跟初始化不是一起的 04/04 20:49
LPH66: 所以刪除時解構跟空間釋放也必須分開, 不能直接 delete 04/04 20:50
LPH66: 那要單獨呼叫 dtor 就是直接寫 xxx->~T() 04/04 20:50
PkmX: 沒有說compiler生出來的我們不能用啊 04/04 22:02
PkmX: 你的問題簡化版如上 把整段程式碼全部看懂你就會了~ 04/04 22:46
kingofsdtw: 買本書吧..孩子 04/05 01:54