2013-02-26 73 views
0

在我的代碼,我有一個std::map看起來是這樣的:映射空指針值

std::map<std::string, A*> myMap; 

其中A是我的自定義類之一。

當我訪問不通過operator[]存在像這樣的地圖元素:

std::string s("hello"); 
A* pA = myMap[s]; 

我知道,一個新的元素與該鍵創建,但我想指針被初始化爲NULL。換句話說,如果myMap[s]存在,應該返回一個有效的指針。如果沒有,我想在上面的代碼執行後,pA爲NULL。

默認情況下,如果myMap[s]不退出,pA是否會包含垃圾?我怎樣才能讓它包含值NULL如果元素不退出?

+1

如果密鑰在調用之前不存在,它將成爲nullptr。在這種情況下,這種自動插入的映射值是一個指針類型,它是值初始化的,每個標準的值初始化指針是零初始化的,這與nullptr是同義的。 IE瀏覽器。你可以免費得到它。 – WhozCraig 2013-02-26 03:23:14

+0

downvoter照顧精心製作?我詳細解釋了我想要達到的目標,並在提供的情況下詢問了有關默認行爲的問題。 – user974967 2013-02-26 03:23:30

+0

@ user974967該問題顯示沒有研究工作(即,您甚至沒有嘗試閱讀手冊)。 – melpomene 2013-02-26 03:25:16

回答

3

簡答:是的,您的指針可以可靠地被視爲一個nullptr在沒有先前值的情況下進行新的密鑰查找。

龍答:

每標準:

C++ 11§23.4.4.3,P5

T& operator[](key_type&& x);

影響:如果沒有鍵相當於地圖上的x,將value_type(std::move(x), T())插入到地圖中。

注意特別是在這種情況下使用的T(),其中T是您的指針類型。這導致...

C++ 11§8.5,P10

其初始化爲空集括號的一個目的,即(),應值初始化

通過值初始化的定義:

C++ 11§8.5,P7

要值初始化類型T的對象是指:

  • 如果T是用戶提供的c(可能是cv-qualified)類類型(第9章) onstructor(12。1),那麼調用T的默認構造函數(並且如果T沒有可訪問的默認構造函數,則初始化不合格);

  • 如果T是一個(可能CV修飾)非工會類沒有用戶提供的構造類型,則該對象是零初始化,並且如果T的隱式聲明的默認的構造是不平凡的,該構造函數被調用。

  • 如果T是一個數組類型,那麼每個元素都是值初始化的;

  • 否則,對象是零初始化。

這給我們帶來了什麼可以爲您的對象類型是零初始化:

C++ 11§8.5,P5

到零 - 初始化T類型的對象或引用表示:

  • 如果T是一個標量類型(3.9),該對象被設置爲值0(零),作爲一個整體常量表達式,轉換到T (103)

  • 如果T爲(可能是cv-qualified)非聯合類類型,每個非靜態數據成員和每個基類子對象都被初始化爲零,並且填充被初始化爲零位;如果T是(可能是cv限定的)聯合類型,則該對象的第一個非靜態命名數據成員是零初始化的,並且將填充初始化爲零位;如果T是聯合類型(可能是cv限定)

  • 如果T是一個數組類型,每個元素都是零初始化的;

  • 如果T是引用類型,則不執行初始化。

103)如在4.10指定,轉換在空指針值整數表達式中,其值是0至指針類型的結果。

+0

感謝您回答問題和有用的信息。 – user974967 2013-02-26 03:41:40

2

是嵌入式類型(如int或指針)的map中的新元素是零初始化的,因此您的指針將爲NULL。