靜態局部變量實在第一次訪問的時候進行初始化的,先來看下初始化的過程
class base { public: base(){} }; void fn() { static base t; }
首先取出一個值和1進行比較 ,如果不等把1 復制給這個地址 然後調用base的構造函數進行初始化
根據上下文 可以理解 其實這個地址就是來標記該靜態變量是否進行過初始化,如果沒有置為1,然戶進行初始化。如果為1,則跳過初始化。
下面考慮多線程的環境當線程1 在賦值標志位之前判斷標志位之後,切換到線程2,線程2也會判斷為未初始化,則 這種情況下base會初始化兩次,考慮一種情況,如果構造函數裡有申請內存的操作則析構時只會析構後者。會造成內存洩露~ 所以多線程的局部靜態變量的初始化也是不安全的~