2015-02-13 2 views
5

Предположим, что у меня есть основной класс SomeManager для отслеживания экземпляров другого класса SomeClass. Когда построено SomeClass, он вызывает метод SomeManager, передающий указатель на него. Затем SomeManager берет этот указатель и вставляет его в вектор. Деструктор SomeClass вызывает другую функцию SomeManager, которая удаляет ее указатель из вектора.C++ 11: Изменяет ли операция перемещения адрес?

Итак, мой вопрос. Когда экземпляр SomeClass перемещается через оператор перемещения или конструктор. Это изменение адреса, и мне нужно удалить старый адрес и добавить новый?

У меня есть некоторые идеи по этому поводу из того, что я прочитал, но я не уверен, и я не хочу ничего испортить.

ответ

16

Короткий ответ: нет, адрес перемещенный из объекта не делает изменения , Но старый объект не может быть полезным.

При выполнении конструкции перемещения вы создаете новый объект и перемещаете содержимое другого объекта в новый объект. Новый объект всегда будет построен в другом месте памяти из старого объекта. Что-то подобное происходит с назначением перемещения: вы просто перемещаете содержимое одного объекта в другой, но для выполнения задания вам все же нужно иметь два разных объекта в двух разных ячейках памяти (ОК, есть самозапуск, но мы это проигнорируем) , Старый объект все еще существует (ОК, он может быть временным, который уничтожается в конце инструкции), но большую часть времени у вас нет гарантии относительно старого объекта, за исключением того, что он находится в некотором правильном состоянии.

Аналогом может быть дом с мебелью. Перемещение построено как , строя новый дом и перемещая мебель к нему. Перемещение назначается как , покупая второй существующий существующий дом и перемещая мебель к нему. В обоих случаях новый дом имеет другой адрес от старого, но старый все еще существует. Это может быть не в полезном состоянии (трудно жить в доме без мебели!).

+5

Все опубликованные ответы кажутся правильными, но визуализация дома победила меня. –

+3

Следует продвигать эту аналогию с авторами книг на C++. –

+0

Хех, спасибо, ребята! Не вошли в систему, чтобы не видеть комментарии. Спасибо за помощь! –

3

Да. Оператор перемещения и оператор присваивания помогают новому экземпляру SomeClass взять на себя ответственность за состояние старого экземпляра, но новый экземпляр имеет отдельный адрес.

Для вас важно рассмотреть вопрос о том, хотите ли вы удалить экземпляр SomeClass, чтобы «самостоятельно зарегистрировать» с SomeManager, поскольку он перемещен из-за ожиданий уничтожения - независимо от того, зависит ли он от вашего точного кода.

3

Перемещение по существу означает «Вот объект X. Создайте новый объект Y, украв внутренности X». Аналогично для назначения перемещения. Вы не перемещаете объект; вы перемещаете его содержимое.

Адрес перемещенного объекта X не изменяется. Его содержимое может меняться (например, становиться пустым) или не может (например, если это примитивный тип, для которого перемещение является копией).

Хотя в схеме вы описываете вам лучше убедиться, что конструктор шаг также регистрирует объект, он создает ...