2013-02-26 71 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。