映射的空指针值

mapped null pointer value

本文关键字:空指针 映射      更新时间:2023-10-16

在我的代码中,我有一个std::map看起来像这样:

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

其中A是我的自定义类之一。

当我通过operator[]访问一个不存在的map元素时,如下所示:

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

我知道将使用该键创建一个新元素,但我希望指针初始化为NULL。也就是说,如果myMap[s]存在,应该返回一个有效的指针。如果不是,我希望在上述代码执行后pA为NULL。

默认情况下,如果myMap[s]不退出,pA是否包含垃圾?我怎么能使它,使pA包含值NULL,如果元素不退出?

简短的回答:是的,在没有先验值的新键查找中,您的指针可以可靠地视为nullptr

长答:

按标准:

C++11§23.4.4.3,p5

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

Effects:如果map中没有x对应的键,则将value_type(std::move(x), T())插入到map中

特别注意 T() 的使用,这里的T是指针类型。

c++ 11§8.5,

初始化式为圆括号的空集合的对象,即(),应value-initialized

通过值初始化的定义:

c++ 11§8.5,

对T类型的对象进行值初始化意味着:

  • 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是病态的);

  • 如果T是没有用户提供的构造函数的(可能是cv限定的)非联合类类型,则该对象为零初始化,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数。

  • 如果T是数组类型,则每个元素都进行值初始化;

  • ,否则为零初始化

  • /blockquote>

    这就引出了对象类型为零初始化的含义:

    C++11§8.5,p5

    对T类型的对象或引用进行零初始化意味着:

    • 如果T是标量类型(3.9),则对象设为值0(零),作为整型常量表达式,转换为T (103)

    • 如果T是(可能是cv限定的)非联合类类型,则每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位;

    • 如果T是一个(可能是cv限定的)联合类型,对象的第一个非静态命名数据成员被初始化为零,填充被初始化为零位;

    • 如果T是数组类型,则每个元素为零初始化;

    • 如果T是引用类型,则不进行初始化

    如4.10所述,将值为0的整型常量表达式转换为指针类型将得到空指针值

是int或指针等嵌入式类型的map中的新元素是零初始化的,因此您的指针将为NULL