作者ko27tye (好滋好滋)
看板C_and_CPP
標題[問題] C++ primer 4/e中文版 p.496
時間Sat May 28 02:12:20 2016
此頁的參用計數class
class U_Ptr{
friend class Hasptr;
int *ip;
size_t use;
U_Ptr(int *p): ip(p), use(1) {}
~U_Ptr() {
delete ip;}
};
為什麼這邊會直接delete? delete一個沒用動態配置的物件不是會有問題嗎?
我實際編譯也出問題,拿掉delete那行才通過編譯。
還是說他本來是想寫以下:
class U_Ptr{
friend class Hasptr;
int *ip;
size_t use;
U_Ptr(int *p):
ip(new int(*p)), use(1) {}
~U_Ptr() { delete ip; }
};
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.135.40
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1464372744.A.13A.html
※ 編輯: ko27tye (36.229.135.40), 05/28/2016 02:13:58
1F:推 EdisonX: 這節是在講 smart pointer , U_Ptr 只是一個代理 , 只負 05/28 03:20
2F:→ EdisonX: 責最後的回收,且它的 ctor 也是 private,所以只有其 05/28 03:20
3F:→ EdisonX: friend class Hasptr 可以用它 . 採用的策略是用 Hasptr 05/28 03:21
4F:→ EdisonX: 負責 new U_Ptr , 最後的 delete 交由 U_Ptr 自己做。 05/28 03:22
5F:→ Killercat: 不過實務上,大多數編譯器在release的時候ip都會null 05/28 07:11
6F:→ Killercat: 所以delete沒有問題,而所有的編譯器在debug build都 05/28 07:12
7F:→ Killercat: 會把ip刻意設定成非null值,跑起來就會炸掉 05/28 07:12
8F:→ Killercat: 不過這個不是spec,不要依賴這種行為 :Q 05/28 07:12
9F:→ Killercat: 但是這個的ip不是從外面傳進來的嗎?除非故意亂傳 05/28 07:13
10F:→ Killercat: 不然應該不是正確可delete的值就是null 05/28 07:13
所以是確保p扔進來前有用動態配置就行了是嗎?
※ 編輯: ko27tye (36.229.135.40), 05/28/2016 10:59:14
※ 編輯: ko27tye (36.229.135.40), 05/28/2016 11:16:05