Я искал ответ, но все еще не могу понять это.
Извините, но моя работа слишком сложна, чтобы скопировать здесь пример кода.
У меня есть функция, которая получает указатель в качестве параметра; Я использую его, но позже мне нужен своего рода обратный вызов, где я хочу использовать свой старый заостренный объект.
Проблема в том, что когда вызывается этот обратный вызов, указатель уже удален или освобожден. Моя идея состояла в том, чтобы сделать копию указанного объекта в куче и освободить ее, когда обратный вызов будет завершен. Но я заблудился между указателями, конструкторами копирования и другими вещами. Решение, вероятно, довольно простое, но я застрял.
Предположим, у вас есть тип T
и указатель T* ptr;
Если предположить, ptr
в настоящее время действительный указатель, то T* ptr2 = new T(*ptr);
должен вызвать конструктор копирования на T, чтобы создать новый указатель на кучу. Теперь это требует, чтобы ваш тип T
имеет правильно написанный конструктор копирования и деструктор и тому подобное.
Если у тебя есть T * p
, тогда вы можете сделать новый объект, например, так:
T x(*p);
Или, если вам нужно (но серьезно, не надо!), Динамически размещаемый объект:
T * q = new T(*p);
Не используйте вторую форму. Там нет конца головной боли, которую вы приглашаете с этим.
Я только что нашел это:
C ++ Idioms / Virtual Constructor
Еще один способ сделать это:
MyObject* pointerFromOld;
...
MyObject newObject = *pointerFromOld;
Звездочка перед указателем возвращает объект, на который она указывает (интерпретирует содержимое адреса как объект), а назначение этого объекта newObject делает его копию.