Моя проблема в том, что константа копирования по умолчанию. испортил мои указатели.Вставка элемента в контейнер: копировать конструктор беспорядок вверх указатели
Упрощенная версия:
У меня есть
A
класса с по умолчанию копию конструка.A
имеет 2 участника-участника:B
иC
.B
имеет указатель наC
.
Ситуация:
хранить
A
вstd::vector
:vector.emplace_back(A(...));
emplace_back делает это:
Создание A (настройка указателя B на C и т.д.)
Копирование А в векторе. (по умолчанию копия СУУ: копии по стоимости)
Уничтожение "по происхождению" А.
. Результат:
- Хранилище имеет
A
, который имеетB
, который имеет указатель на старого в C. Что больше не существует.
Простое решение будет:
- В
A
было бы указатели наB
иC
Но это не так хорошо, потому что почему должны иметь указатели, когда его владеет его B и C и B и C ресурсом жизни с A.
Вопрос:
не лучший способ, чем иметь указатели в?
Или нет более простого способа, чем возиться с реализациями конструктора копирования?
Я думал, что emplace построит «на месте», так зачем нужна копия ctr?
Я не понимаю, в чем вопрос. Возможно, вы предоставили бы соответствующий примерный код, чтобы узнать, что на самом деле происходит ... На основе вашего описания кажется, что 'C' должен иметь конструктор, принимающий адрес соответствующего объекта' B', а 'A' должен иметь подходящий конструктор копирования/copy, чтобы правильно установить указатели на содержащийся объект 'C'. –
Я удалил свой ответ, потому что это был намек на создание объекта * на месте *, но не затрагивает основную проблему испортения указателей. Для получения полного решения вам необходимо разместить образец кода или MCVE. –
Emplace может вызывать перераспределение, которое копирует или перемещает элементы вокруг – MikeMB