2013-11-21 48 views
1

我想用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運算符對它有用嗎?

我如何實現我自己的分配器?我是否正確,不使用新操作員的自定義分配器會打破上述代碼,即我仍然需要刪除器?

回答

1

我可以安全地假定的std ::分配器實現使用新 分配內存,所以默認刪除由 的std :: shared_ptr的使用操作是好的呢?

不,你不能。默認的std::allocator<T>被定義爲使用全局分配內存::operator new,但我認爲不需要每次調用allocate只需一次調用::operator new,或者從allocate()返回的值等於從new返回的值。

釋放內存的正確方法是在分配器上調用deallocate(),該分配器將使用全局的::operator delete

因此,您的代碼沒有正確釋放數據。它只是發生在你的執行工作是std::allocator沒有做什麼特別的東西與分配,以及上0​​調用delete行爲與調用全球運營商delete。它可能會失敗其他類型或其他實現。

此外,allocate()不初始化對象,所以調用delete將調用析構函數的某些永遠不會構造的內存。如果類型不是微不足道的,那麼這有未定義的行爲(儘管如此,int也是微不足道的)。

您的代碼不是自定義的分配一定正確或者,出於同樣的原因。