當使用 unique_ptr 時,很容易忘記初始化指標,這可能導致在運行時崩潰。
為什么 unique_ptr 定義了一個默認的建構式,讓它指向 nullptr?如果它一直需要一個建構式引數,程式員將被迫把它放在初始化器串列中。好吧,如果默認的建構式是有用的,那么用某種需要建構式引數的 valid_unique_ptr 不也是有用的嗎?
我是否應該對 unique_ptr 進行子類化以強制初始化,或者也許包裝才是正確的做法?
我有點驚訝,我在任何地方都找不到這個建議或做法......
示例:
#include "XTimerFactory.h"/span>
struct MyClass {
MyClass(XTimerFactory& timerFactory)
: m_timer(timerFactory.createTimer() // <- 至關重要,否則以后程式會崩潰。
{ }
void start() { m_timer-> start(100); }
private:
std::unique_ptr<XTimer> m_timer。
}
uj5u.com熱心網友回復:
默認的建構式(nullptr 初始化)允許該類在更多的情況下使用,而不是讓建構式總是指向一個有效的實體。為什么unique_ptr的定義有一個默認的建構式,讓它指向nullptr?
例如,當你把唯一的指標放在一個向量中時,它允許安全而容易地實作vector::resize操作。
我是否應該對 unique_ptr 進行子類化以強制初始化,或者也許包裝才是正確的做法?
一般來說,如果該類沒有虛擬析構器,請考慮包裝而不是子類化它。
我有點驚訝,我在任何地方都找不到這樣的建議或做法......
也可以參考std::reference_wrapper和std::ref - 盡管這些并不占用所有權。
這是我不久前做的一個類似的實作(不要臉的插播:D)。https://codereview.stackexchange.com/questions/54371/polymorphic-owned-reference-wrapper-for-class-hierarchies
uj5u.com熱心網友回復:
為什么unique_ptr的定義有一個默認的建構式,讓它指向nullptr?可能是因為默認的可構造型別通常是有用的和方便的。
我是否應該對 unique_ptr 進行子類化以強制初始化,或者說包裝才是正確的做法?
兩者都應該可以。
uj5u.com熱心網友回復:
當使用unique_ptr時,很容易忘記初始化指標,這可能會導致在運行時崩潰。
這就是為什么你堅持使用
auto uFoo = std::make_unikue<Foo>();(自C 14)。 這樣,你的新變數將永遠有效。當所有權從其他std::unqiue_ptr物件中傳遞時,使用一個默認的建構式或一個接受原始指標的代價函式是很有用的。所以將沒有辦法使用std::make_unique,否則總是堅持使用它。此外,
std::unqie_ptr在設計上可能是nullptr,因為有release和operator bool,否則就沒有意義了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321884.html
標籤:
上一篇:在MFC的OnButtonClick函式中呼叫winuser.h中的GetDesktopWindow()函式而不是CWnd::GetDesktopWindow()。
