我想用shared_ptr來管理動態分配的數組。在我學習STL分配器的存在之前,我總是使用new []來分配內存併爲shared_ptr編寫一個刪除器來釋放它。然後,該代碼將如下所示:我是否需要一個用於shared_ptr的刪除程序來釋放分配程序分配的內存?
struct ArrayDeleter
{
void operator()(int* p) { delete [] p; }
};
...
...
std::shared_ptr<int> array(new int[100], ArrayDeleter());
...
沒有ArrayDeleter以釋放內存,像Valgrind的工具將報告內存錯誤不平衡的新的[]和delete []。我明白這個問題是由shared_ptr調用delete
而不是delete[]
來釋放內存引起的。
然而,不知是否是由分配器分配的內存相同的情況。我的代碼如下所示:
std::allocator<int> alloc;
std::shared_ptr<int> array(alloc.allocate(10));
...
所以沒有在代碼中提供特定的刪除程序。然後我用valgrind檢查了程序,但是這一次,它沒有任何抱怨。那麼我可以安全地假定std :: allocator被實現爲使用new
分配內存,所以std :: shared_ptr使用的默認delete
運算符對它有用嗎?
我如何實現我自己的分配器?我是否正確,不使用新操作員的自定義分配器會打破上述代碼,即我仍然需要刪除器?