Да, если вы берете адрес элементов вашего
vector<Card> _shoe;
и размещение их в вашем
deque<Card *> _cards;
Определенно может быть проблема, как вы описываете. Ваш вектор мог перераспределиться, в результате чего адрес элементов карты вектора больше не действителен.
Передача ссылок (постоянных или иных) на содержимое вашего вектора будет иметь те же проблемы, что и передача указателей. В C ++ ссылка действительно является тонко завуалированным указателем. Единственное отличие от указателя заключается в том, как он используется (в качестве псевдонима), в том, что он не может быть «незаполнен», в том, что он равен NULL, и в том, что он не отличается от псевдонима (вы не можете вектор карточных ссылок). Ссылка не имеет никакого специального подсчета ссылок или чего-либо другого, что вы получаете с другими языками сборки мусора. Поэтому, когда ваш вектор перераспределяется, и если кто-то держит ссылку на любую из карт в колодах, эти ссылки потерпят неудачу так же легко, как и указатель.
Замена вашего вектора на вектор карт Boost :: shared_ptr может решить ваши проблемы. Boost :: shared_ptr подсчитывается по ссылке. Это означает, что он отслеживает, сколько существует ссылок на базовый объект. И ваш вектор будет вектором shared_ptrs, а не самого объекта. Поэтому, когда вектор перераспределяется, вы просто временно добавляете новый реферер к базовому объекту во время перераспределения, а затем вектор заменяет shared_ptr на shared_ptr, живущий в перераспределенном пространстве. Базовый объект не двигается.
Я бы сделал еще один шаг и рекомендовал бы не давать всем shared_ptr. Передайте boost :: weak_ptr не владельцам. Boost :: weak_ptr - слабая ссылка на базовые данные. Слабый_птр дает кому-то ручку для получения shared_ptr при необходимости. Он не участвует в подсчете ссылок базовых данных. Таким образом, вы можете сначала проверить, были ли основные данные удалены владельцем. Затем, если он не был удален, получите shared_ptr (временно участвующий в подсчете рефереров) и выполните необходимое действие.