make_shared我代替new
使用宏來獲得在調試模式下一些額外的信息:C++的std ::有新的宏
#if defined(_DEBUG)
#define SAGE_NEW new(__FUNCTION__, __FILE__, __LINE__)
#else
#define SAGE_NEW new
#endif
我發現這個定製內存分析和內存泄漏檢測非常有用。我剛開始使用共享指針,所以現在我喜歡做堆對象:
auto myThingy = std::shared_ptr<Thingy>(SAGE_NEW Thingy(Args));
我剛纔得知std::make_shared
是首選,因爲它使用較少的內存分配。有沒有什麼辦法可以將我的SAGE_NEW
加入make_shared
?我意識到這對泄漏檢測無關緊要,但我仍然喜歡它的內存使用情況統計。似乎allocate_shared
以某種方式持有答案,但我還沒有弄清楚。謝謝! :)
編輯: 對那些詢問new
- 我有一個自定義new
超載了。編譯器選項SAGE_MEM_INFO將啓用泄漏檢測和內存使用統計信息,否則會跳過日誌記錄並直接進入我的內存池分配。我有新的[]和delete []變種,但我忽略那些爲簡潔:
#ifdef SAGE_MEM_INFO
void* operator new (size_t size){ ++appAllocs; return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
... Log memory usage
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
void operator delete (void* ptr, char const *function, char const *filename, int lineNum)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
#else
void* operator new (size_t size){ return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr) { myFree(ptr); }
void operator delete (void* ptr, char const *function, char const *filename, int lineNum) { myFree(ptr); }
#endif
快速評論:人們經常提到make_shared的內存分配。這是真的,但這是一次性成本(每個指針)。另一個很好的理由是,當你使用make_shared時,對象本身及其引用計數(可能還有其他東西)全部被放入連續的內存塊中。這會導致複製和刪除副本的更好的緩存行爲,這種操作可能會在創建的每個指針上重複多次。 – 2014-09-20 18:51:54
如果您有解決方案,請將其寫爲答案。這個問題的答案是,你的_問題。 – 2014-09-20 22:38:05
對於上面顯示的原始宏,您需要記住定義一個相應的佈局「operator delete」,因爲如果構造函數拋出,則由佈局新表達式調用該佈局。沒有它,你會得到內存泄漏,這是你要消除的東西。這是一次臭名昭着的MFC錯誤。 – 2014-09-20 22:54:25