Поведение вызывающего оператора [], когда сопоставленное значение не назначено клавише - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть что-то вроде этого:

#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 при вызове оператора индекса ([]), когда для клавиши не назначено сопоставленное значение, а тип возвращаемого значения - указатель?

Ответы [ 2 ]

10 голосов
/ 09 февраля 2011

«Конструкторы по умолчанию» примитивных типов (включая указатели) создают 0-заполненную память, во многом как глобальные переменные.

Вот соответствующий стандартный язык (из dcl.init):

Инициализация по умолчанию объекта типа T означает:

- если T является типом класса, отличным от POD ( class ), вызывается конструктор по умолчанию для T (и инициализация некорректна, если T не имеет доступного конструктора по умолчанию);

- если T является типом массива, каждый элемент инициализируется по умолчанию;

- в противном случае,хранилище для объекта инициализируется нулями.

...

7 Объект, инициализатором которого является пустой набор скобок, т. е. (),
, должен инициализироваться по умолчанию.

Также из lib.map.access:

23.3.1.2 доступ к элементу карты [lib.map.access]

оператор ссылки [] (const key_type & x);

Возвращает: (* ((insert (make_pair (x, T ()))). first)). second.

0 голосов
/ 09 февраля 2011

Как и любая неинициализированная переменная, вы не можете предполагать, что она будет правильно инициализирована значением. Это будет зависеть от вашей сборки, выпуска или отладки, вашего компилятора, вашей платформы и т. Д. Я бы, вероятно, сделал это:

if(mapaString.find(key) == mapaString.end()) { mapaString[0] = 0; }

Тогда вы можете быть уверены, что указатель для ключа был инициализирован в 0 / NULL.

...