BSTR
是一個C結構,你必須調用SysAllocString
和SysFreeString
。 _bstr_t
是C++類型,可爲您調用SysAllocString
和SysFreeString
,並且在std::vector
中完全安全。在處理_bstr_t
對象時,您不必也不應該撥打電話SysAllocString
或SysFreeString
。
如果您是不是與C結構處理BSTR
對象:
(1)您可以放心地智能指針,儲存在容器中,除了auto_ptr
,它只是假裝聰明。
(2)A vector
可以存儲_bstr_t
,但它不瞭解SysFreeString
,您將不得不手動調用它。就像你必須在原始指針上使用delete
一樣,因爲_bstr_t
是而不是一個智能指針。
(3)a std::unique_ptr<BSTR, HRESULT (*)(BSTR)>(mybstr, SysFreeAlloc)
是一款智能指針,它可以安全且神奇地爲您做所有事情,包括完全安全地存儲在一個向量中,無需開銷。然而,這是醜陋的來寫,所以多數人使用:
template<class T, class F>
std::unique_ptr<T, F> make_unique(T t, F f)
{return std::unique_ptr<T,F>(std::move(t), std::move(f));}
typedef decltype(make_unique(declval<BSTR>(), SysFreeAlloc)) bstr_ptr;
std::vector<bstr_ptr> container;
container.push_back(make_unique(mybstr, SysFreeAlloc));
不過,這不只是_bstr_t一種類型的智能指針?或者它是否特別說明你不應該把auto_ptr放進去?如果是這樣,爲什麼這是特別你不應該把auto_ptr在那裏?我曾經在某個時候讀過這篇文章,但我不記得現在爲什麼。 – Jonnster
auto_ptr具有「怪異」的複製語義,但std容器需要一些標準的複製和分配語義。引用計數智能指針通常具有這樣的語義。 – ltjax
aalways喜歡unique_ptr到shared_ptr –