2016-03-30 19 views
0

我碰到這片今天代碼:指向調用類的構造函數的資源是否安全?

KeepaliveThread::KeepaliveThread(VideoDevice *device) 
: Thread() 
{ 
     ... 
     startup_lock = new Mutex("KeepaliveThread::startup_lock"); 
} 

Mutex::Mutex(const char *title, int recursive) 
{ 
     this->title = title; 
     ... 
} 

是這個 - 使用>標題安全嗎?推測「KeepaliveThread :: startup_lock」是一個靜態的內存區域,所以從該位置讀取總是安全的。

你認爲這是可接受的或不好的做法?

+0

澄清:當然在Mutex的構造函數中它是安全的,但我的意思是在其他Mutex方法中。 – blippy

+0

從這種特殊情況下它是安全的,這是「安全」的。如果'this-> title'的類型是'std :: string',那將是完全安全的。 – molbdnilo

回答

1

[lex.string]

普通字符串和UTF-8字符串文字也稱爲窄字符串文字。窄字符串文字的類型爲「數組nconst char」,其中n是下面定義的字符串的大小,並且具有靜態存儲持續時間(3.7)。

,如果我們去到3.7這是[basic.stc]從和specificly [basic.stc.static]我們

不具有動態存儲時間的所有變量,沒有線程存儲時間,並且不在本地有靜態存儲時間。這些實體的存儲應在程序期間持續(3.6.2,3.6.3)。

所以你的字符串字面具有靜態存儲時間和存儲時間持續計劃的持續時間,從而可以安全地存儲const char*爲字符串字面

請注意,任何試圖修改字符串即使編譯器允許您將char*存儲到它,文字也是未定義的行爲。

相關問題