2017-02-20 46 views
1

http://en.cppreference.com/w/cpp/memory/unique_ptr的unique_ptr自動毀滅魔法

問題:爲什麼close()方法被調用只有FP不爲空?

std::unique_ptr<std::FILE, decltype(&std::fclose)> fp(std::fopen("demo.txt", "r"), 
                 &std::fclose); 
    if(fp) // fopen could have failed; in which case fp holds a null pointer 
    std::cout << (char)std::fgetc(fp.get()) << '\n'; 

註釋塊下面:// FCLOSE()這裏所謂的,但只有當FILE *是不是一個空指針 //(也就是說,如果成功的fopen)

問題 : 這怎麼發生的?我知道調用close(NULL)是不好的。那麼支票在哪裏發生? decltype(& std :: fclose)知道如何檢查null?如果在其他時間甚至在空值上調用它是可取的並且由函數處理呢?

+0

不好。錯過了。將嘗試刪除該問題。 – Pranay

+0

留下問題,問得好,可能會幫助別人。 –

回答

4

unique_ptr::~unique_ptr的要求要求它將get()nullptr進行比較,並且只在非空的情況下調用刪除器。

如果打電話給nullptr的刪除程序是可取的,那麼您的應用程序是非典型的,可能不適合使用unique_ptr。您無法修改此行爲。

+0

不可取,但可能該函數處理nullcheck而不是被調用者。如果我真的想要的話,我可以寫一個關於unique_ptr的包裝器。 – Pranay

+2

技術上,'unique_ptr ::〜unique_ptr'檢查指針值是否與默認構造的刪除器的指針類型不同。所以你可以提供你自己的指針類型,默認構造一個永遠不會匹配任何實際指針值的值,包括nullptr。 – rustyx

+0

@RustyX恕我直言,你的評論與一個非常有趣和相關的方式相矛盾的答案。如果你有一個資料來源,你應該將其作爲答案發布;如果你的源是合法的,我肯定會贊成。 –