Причина аварии:
Вы должны следовать правилу трех , чтобы избежать этой проблемы с висящими указателями.
Если вам нужно явно объявить деструктор, конструктор копирования или оператор копирования, вы, вероятно, должны явно объявить все три из них.
В вашем случае Вы не определяете оператор присваивания копии, что приводит к полному копированию указателя.
Предлагаемое решение:
Если вы можете использовать std::string
вместо char *
, просто просто используйте std::string
, он имеет первое и главное преимущество перед любыми глупыми указателями.
Вы можете обойтись без всяких прикольных указателей, используя std::string
.
Если вы не можете читать, и следующее предложение относится к любому члену указателя класса в целом.
Обратите внимание, что идеальное решение здесь - вообще не использовать сырые указатели. Когда вы используете сырые указатели, вы вынуждены вручную управлять приобретенными ими ресурсами, всегда трудно и подвержено ошибкам управлять ресурсами вручную. это избежать этого.
Для этого следует использовать Умный указатель , который будет неявно управлять динамической памятью указателя. Использование умного указателя обеспечит неявное освобождение динамической памяти после использование и вам не нужно вручную управлять им.
Сценарий, который у вас есть, является той самой причиной, по которой в C ++ вы должны полагаться на RAII , а не на ручное управление ресурсами, и использование Smart-указателя - это путь, который вам нужен .
Оговорка:
Обратите внимание, что я воздержался от предложения , какой умный указатель использовать, потому что выбор скорее зависит от владения и времени жизни задействованных элементов, что не ясно из данные, приведенные в Вопросе. Поэтому я предлагаю прочитать,
Какой указатель мне использовать, когда?
для выбора интеллектуального указателя.