映射的空指针值
mapped null pointer value
在我的代码中,我有一个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类型的对象或引用进行零初始化意味着:
如4.10所述,将值为0的整型常量表达式转换为指针类型将得到空指针值。
如果T是标量类型(3.9),则对象设为值0(零),作为整型常量表达式,转换为T (103)
如果T是(可能是cv限定的)非联合类类型,则每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位;
如果T是一个(可能是cv限定的)联合类型,对象的第一个非静态命名数据成员被初始化为零,填充被初始化为零位;
如果T是数组类型,则每个元素为零初始化;
如果T是引用类型,则不进行初始化
是int或指针等嵌入式类型的map中的新元素是零初始化的,因此您的指针将为NULL
- 如何创建对象函数指针C++映射?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 将多映射转换为空指针,然后转换回多映射
- 映射的空指针值
- C++STL映射:insert正在存储空指针