Карта C ++ [] = разветвления памяти - PullRequest
2 голосов
/ 02 июня 2019

Допустим, у вас есть неупорядоченная карта переменных экземпляра, которая отображает целое число на объект (например, на объект времени). Если вы перезаписываете эту карту и используете стандартную перезапись, например, map_ [5] = time.now () в функции класса, где этот объект time.now создается? Находится ли она в стеке, где была функция, и поэтому, когда функция выходит из области видимости, время на карте выходит из области видимости? Или это с объектами класса, чтобы вы могли проверить это время позже?

Как правило, если вы пишете в карту поля экземпляра в одной функции и сохраняете объекты, к которым вы хотите обращаться позже, можете ли вы использовать обычные объекты или вам нужно использовать указатели?

Я некоторое время не использовал C ++, и я пытаюсь переучить нюансы, и это меня действительно смущает. Спасибо!

1 Ответ

3 голосов
/ 02 июня 2019

Время жизни объектов, содержащихся в std::map или std::unordered_map, - это время жизни карты. Имейте в виду, что объект, который вы назначаете элементу карты, не совпадает с объектом, содержащимся в карте.


Например, в этом фрагменте:

std::map<int, std::chrono::system_clock::time_point> my_map;
auto now = std::chrono::system_clock::now();
my_map[10] = now;

На самом деле задействовано как минимум два time_point объекта:

  1. now
  2. my_map[10]

Строка my_map[10] = now на самом деле делает совсем немного:

  1. Поскольку в my_map для ключа 10 не существует значения, map::operator[] по умолчанию создает новый объект time_point, вставляет его в my_map и возвращает ссылку на него.
  2. Функция оператора присваивания возвращенного объекта time_point вызывается и передается ссылка на now.
  3. time_point::operator= регулирует состояние time_point, которое было вызвано, для отражения состояния time_point, переданного ему.

Это time_point объект, который хранится на карте, чье время жизни контролируется картой. now - локальная переменная, поэтому срок ее службы заканчивается в конце области, в которой она была объявлена.


Например, с учетом следующего определения класса:

class Foo {
public:
    const std::chrono::system_clock::time_point& do_a_thing(int i);
private:
    std::map<int, std::chrono::system_clock::time_point> my_map;
};

Недопустимо следующее определение do_a_thing:

const std::chrono::system_clock::time_point& do_a_thing(int i) {
    auto now = std::chrono::system_clock::now();
    my_map[i] = now;
    return now;  // whoops, returning a reference to a function local
}

, в то время как действует следующее:

const std::chrono::system_clock::time_point& do_a_thing(int i) {
    auto now = std::chrono::system_clock::now();
    my_map[i] = now;
    return my_map[i]; // OK, the lifetime of my_map[i] is the same as my_map
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...