日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

set_new_handler(0)有什么用_C 語言

作者:林夕07 ? 更新時間: 2022-10-09 編程語言

出自《STL源碼剖析》第45頁中有一行代碼set_new_handler(0);

源代碼

    inline T* _allocate(ptrdiff_t size, T*)
    {
        std::set_new_handler(0);
        T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
        if (tmp == 0)
        {
            std::cerr << "out of menory" << std::endl;
        }
        return tmp;
    }

解釋

首先說一下C++對內存分配的原理。如果程序員決定用new operator向計算機申請一塊內存,那么就可能會遇到內存不夠的情況。一旦內存不夠申請失敗,那么默認情況下C++會拋出std::bad_alloc異常。但是如果你不想讓它拋出異常,而是想自己寫一個程序來處理內存不夠的情況,那么你就可以用set_new_handler(new_handler),把new_handler指向你寫的內存不夠的處理程序。這樣內存不夠了的話C++就會去調用你寫的內存不夠處理程序,然后再做后續處理。如果你寫set_new_handler(0)也就是set_new_handler(nullptr),實際上就是強制C++認為你沒有自定義的內存不夠處理程序(因為指針是0嘛),所以說當內存不夠的時候,C++就會直接拋出std:bad_alloc異常。

因為在這個例子中是一個模板函數,所以說誰也不知道用戶在模板實例化的時候前面有沒有給set_new_handler指定什么自定義的內存不夠處理函數。所以這個用set_new_handler(0),就是為了強制C++在內存不夠的時候拋出std:bad_alloc,而不是去執行什么其他自定義的內存不夠處理程序。所以這里用set_new_handler(0)不是沒有用,而是強制C++在內存不夠的時候一定要拋出std:bad_alloc異常

總結

set_new_handler(0)主要是為了卸載目前的內存分配異常處理函數,這樣就會導致一旦分配內存失敗,C++就會強制性拋出std:bad_alloc異常,而不是跑到處理某個異常處理函數去處理。

原文鏈接:https://blog.csdn.net/qq_45254369/article/details/124774054

欄目分類
最近更新