2015-10-16 49 views
1

如下Boost文檔:升壓pool_allocator內存池的行爲澄清

注意

由這個分配器使用的基礎singleton_pool構造一個永遠不會被釋放池實例。這意味着分配器分配的內存在main()完成後仍然可以使用,但可能意味着某些內存檢查程序會抱怨泄漏。

我感到困惑,因爲我檢查了代碼,並且singleton_pool似乎仍然只在當前進程的堆上創建。即如果這個進程被操作系統殺死了,這個池會被釋放嗎?那麼上面的註釋僅僅意味着如果一些守護進程線程繼續運行,並且這個池在main()之後仍然可用?或者它實際上意味着即使在整個過程被殺後該池也不會被釋放?

在我看來,pool_allocatorfast_pool_allocator都使用相同的機制來分配內存,即從這樣的singleton_pool單例中分配內存。但是,該說明未針對fast_pool_allocator指定。我認爲他們兩人的行爲在上面的這樣一個註釋中是一樣的。我對麼?

請幫忙。謝謝。

+1

「主完成後」但程序退出之前...主要還有一些事情要做。但是當程序死亡時(當然你的操作系統會處理它,而不是一些有限的嵌入式平臺),內存當然會返回到操作系統。 –

+1

@MarcGlisse就是這樣?我認爲有一些我沒有掌握的黑魔法...... D'or。 –

+1

@MarcGlisse請記住,如果寫作答案,所以我可以接受謝謝:) –

回答

0

singleton_pool使用非本地靜態變量的初始化特性實現線程安全(在某些條件下)不帶鎖的單例。源代碼的一部分:

template <typename Tag, 
    unsigned RequestedSize, 
    typename UserAllocator, 
    typename Mutex, 
    unsigned NextSize, 
    unsigned MaxSize > 
class singleton_pool 
{ 
    ... 
    struct object_creator 
    { 
     object_creator() 
     { // This constructor does nothing more than ensure that instance() 
     // is called before main() begins, thus creating the static 
     // T object before multithreading race issues can come up. 
     singleton_pool<Tag, RequestedSize, UserAllocator, Mutex, NextSize, MaxSize>::get_pool(); 
     } 
     inline void do_nothing() const 
     { 
     } 
    }; 
    static object_creator create_object; 
}; // struct singleton_pool 

非本地變量初始化爲程序啓動的一部分,主要功能的執行開始,並在程序終止時得到拆除前。所以singleton_pool將在main()之前創建,並在main()之後銷燬。如果過程終止,當然游泳池將被釋放。