2011-05-09 48 views
3

我有一個Visual Studio 2008 C++應用程序,我正在實現替換容器中使用的標準分配器,如std::vector。但是,我遇到了一個問題。我的實現依賴於擁有資源句柄的分配器。在使用rebind功能的情況下,我需要將句柄的所有權轉移給新的分配器。事情是這樣的:在std :: allocator上傳遞對象的所有權rebind

template< class T > 
class MyAllocator 
{ 
public: 
    template< class U > 
    explicit MyAllocator(const MyAllocator<U>& other) throw() 
     : h_(other.Detach()) // can't do this to a `const` 
    { 
    }; 

    // ... 

private: 
    HANDLE Detach() 
    { 
     HANDLE h = h_; 
     h_ = NULL; 
     return h; 
    }; 

    HANDLE h_; 
}; // class MyAllocator 

不幸的是,我不能,因爲它是const緩解手柄所有權的老分配器。如果我從rebind構造函數中刪除const,那麼容器將不會接受它。

error C2558: class 'MyAllocator<T>' : no copy constructor available or copy constructor is declared 'explicit' 

是否有解決此問題的好方法?

感謝,

PaulH

+0

不需要分配器不需要狀態?關於分配器的經典文章,Matt Austern,IIRC,但我現在找不到它... – sbi 2011-05-09 19:32:54

+2

這裏是文章:[http://drdobbs.com/cpp/184403759](http://drdobbs。 COM/CPP/184403759)。從快速瀏覽[this discussion](http://gcc.gnu.org/ml/libstdc++/2004-10/msg00303.html),似乎確實支持有狀態分配器,儘管std lib實現支持用於成爲一個問題。 – sbi 2011-05-09 19:36:10

+0

@sbi - 感謝您的文章和討論。我打算跟進一個關於如何處理'std :: swap'的問題。 – PaulH 2011-05-09 19:44:03

回答

1

如果聲明h_作爲mutable會發生什麼?

2

不太瞭解分配器(從不需要它們):您的副本需要const ref,因此承諾不會更改other對象,但您仍嘗試對其進行更改。雖然有類的設計方式(std::auto_ptr),這確實看起來很腥。
在語法上,你總是可以宣佈h_mutable,使Detach()一個const成員函數,但我嚴重質疑的語義此設置的,使用大刀通過句法叢林黑客我的路前。

1

你可以用一個額外的間接尋址來解決這個問題,但它不是一個理想的解決方案。基本上,您的分配器將有一個指針到將在構造函數/析構函數中分配/釋放的句柄。它指向的句柄在整個過程中都是非const的,因此您可以將句柄從一個分配器「移動」到另一個分配器。儘管如此,這確實給分配器增加了一些開銷。

我不知道你的確切情況,但它似乎是一個非平凡可複製的狀態分配器應該仔細考慮所有的影響。有沒有另外一種方法可以簡化其設計,因此它沒有移動專用手柄?

1

,則不能傳輸的所有權,因爲分配器可以被複制並且甚至在單個容器中,並同時使用所得到的情況下反彈多次。

你必須共享資源來代替。使用引用計數爲資源創建間接引導。喜歡的東西:

class SharedHandle { 
    HANDLE h_; 
    int count; 
    SharedHandle(HANDLE h) : h_(h), count(1) {} 
    ~SharedHandle() { CloseHandle(h_); } // or whatever to release the resource. 
    SharedHandle *Ref() { ++count; return this; } 
    void Unref() { if(!--count) delete this; } 
} 

比:

explicit MyAllocator(const MyAllocator<U>& other) throw() 
: h_(other.h_->Ref()) 

除了自然需要分配異質塊像hash_map/unordered_map容器,容器的微軟實現被稱爲分配各種奇怪的事情。當我在一個Windows應用程序中追蹤分配時,有很多來自STL內部的奇怪大小的分配。

相關問題