是否可以重寫STL分配,管理和釋放內存的方式?如果可能的話,會怎麼做呢?有沒有辦法做到這一點,以保持在一個類或文件中處理原始內存的代碼?重寫內存分配方法標準庫使用?
我想這樣做我的整個程序,所以我可以跟蹤內存使用情況,時間和生命週期信息。純粹出於好奇當然!
是否可以重寫STL分配,管理和釋放內存的方式?如果可能的話,會怎麼做呢?有沒有辦法做到這一點,以保持在一個類或文件中處理原始內存的代碼?重寫內存分配方法標準庫使用?
我想這樣做我的整個程序,所以我可以跟蹤內存使用情況,時間和生命週期信息。純粹出於好奇當然!
您可以通過在其中一個文件中重新定義運營商new
和delete
來實現此目的。
解析符號時,鏈接器將覆蓋標準的鏈接器。
你會發現很多很多的答案,就像這樣:overloading new/delete或那一個:How to track memory allocations in C++ (especially new/delete)。
在互聯網上有一些圖書館也爲你做這個,比如Memtrack或this one。 SO也有一些資源:C++ memory leak auto detection library。
使用動態存儲持續時間管理數據的標準庫類以allocator作爲其模板參數之一。然後該類將調用分配器的一個實例進行內存管理。例如,您可以執行std::vector<int, MyAllocator> somevec;
或std::list<Node*, MyAllocator> someList;
向容器提供自定義分配器。
這是SO Q&A about allocators。鏈接的答案包括分配器的骨架代碼,這應該是一個很好的起點。
唉,是的,我忘了分配器是一個模板參數。我依稀記得他們被描述爲編碼的複雜事務,但我會給出一個迴旋 – 2013-04-26 10:41:39
實際上,一個基本的分配器很容易製作。看看我的答案中包含的鏈接中列出的要求。這裏還有一些框架代碼來創建標準庫兼容分配器 - http://stackoverflow.com/a/12529302/845568 - 它應該是一個體面的開始。 – 2013-04-26 13:05:45
是的......這很難......而且......你可以通過使用valgrind來達到同樣的效果嗎? – 2013-04-26 07:31:03
如果你在linux上,你可以看看男人(2)brk和sbrk。不知道在Windows上。 – Nbr44 2013-04-26 07:31:22
你必須替換運算符'new'和'delete',所以運行 - 不要走到書店,並獲得[Effective C++]的第8章(http://www.amazon.com/Ectivective-Specific-Improve -Programs-Designs/dp/0321334876) – TemplateRex 2013-04-26 07:34:08