当没有为键分配映射值时调用operator []的行为

时间:2011-02-09 20:33:03

标签: c++ pointers map operators g++

我有这样的事情:

#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;
}

gcccpluplus.com的文档中,它只是被称为元素的默认构造函数,但是当声明指针而不初始化它时,它的值将是未定义的。

当没有为该键分配映射值并且返回类型是指针时,是否保证在调用下标运算符([])时返回的值将是一个NULL指针?

2 个答案:

答案 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。