2017-03-15 20 views
3

背景: 由於硬件相關的原因,我需要分配使用DOS Protected Mode Interface的內存以便與一些低級別接口(例如VESA BIOS Extensions)進行通信。是否可以使用自定義靜態分配器? /一種方法來僞造它?

現狀: 所以我可以超載newdelete用於動態分配的內存這是偉大的,但我真的想超載分配器的靜態分配的內存。我正在處理的項目是相當老的庫,因此需要相當數量的靜態全局變量。

問題: 有沒有什麼辦法可以讓這些變量的分配過程超載?如果沒有,是否有一個模板可以動態分配這些變量,這些變量不需要顯式分配或刪除,並且幾乎完全透明?

+7

全局變量是靜態的還是不是靜態的,都不是在堆上動態分配的。它們被放入程序加載時初始化的特殊段中。特殊段中的存儲由編譯器完成,在程序運行之前,程序加載器會對存儲段中的段進行初始化。 –

+0

你的目標是MS DOS嗎?你正在使用哪種編譯器? –

+0

是的,我使用DJGPP(i586-pc-msdosdjgpp-gcc(GCC)6.3.0)瞄準MS-DOS, – Gravis

回答

0

不幸的是,沒有關鍵字來指定您希望使用的內存分配類型,並且沒有用於強制堆分配的標準模板。我能找到的最好答案就是創建一個小的包裝類,它根據需要分配和刪除內存,併爲您提供訪問指針的權限。這不是什麼幻想,但這是我的一些代碼。

template<typename T> 
class mem 
{ 
public: 
    mem(void) { m_data = reinterpret_cast<T*>(dos::malloc(sizeof(T))); } 
~mem(void) { dos::free(m_data); m_data = nullptr; } 
    T* operator ->(void) noexcept { return m_data; } 
    operator T*(void) noexcept { return m_data; } 

private: 
    T* m_data; 
}; 
相關問題