我有这样的事情:
#include <iostream>
#include <map>
int main() {
std::map<int, int*> mapaString;
int* teste = mapaString[0];
std::cout << teste << std::endl;
if(!teste)
mapaString[0] = new int(0);
std::cout << mapaString[0] << std::endl;
std::cout << mapaString[1] << std::endl;
return 0;
}
在gcc和cpluplus.com的文档中,它只是被称为元素的默认构造函数,但是当声明指针而不初始化它时,它的值将是未定义的。
当没有为该键分配映射值并且返回类型是指针时,是否保证在调用下标运算符([])时返回的值将是一个NULL指针?
答案 0 :(得分:10)
原始类型(包括指针)的“默认构造函数”产生0填充的内存,就像全局变量一样。
这是相关的标准语言(来自dcl.init):
默认初始化一个对象 类型T表示:
- 如果T是非POD类类型 ( class ),默认构造函数 调用T(如果T有,则初始化是不正确的 没有访问 - sible default constructor);
- 如果T是数组类型,则每个 element是默认初始化的;
- 否则,存储为 对象是零初始化。
...
7一个初始值为a的对象 空的圆括号,即(),
应默认初始化。
另外,来自lib.map.access:
23.3.1.2 map element access [lib.map.access]
引用运算符[](const key_type&amp; x)的;
返回: (*((insert(make_pair(x,T())))。first))。second。
答案 1 :(得分:-1)
就像任何未初始化的变量一样,你不能假设它会被正确地初始化为值。这将取决于您的构建,发布或调试,您的编译器,您的平台等。我可能会这样做:
if(mapaString.find(key) == mapaString.end()) { mapaString[0] = 0; }
然后你可以确定key的指针初始化为0 / NULL。