причина аварии:
Вы должны следовать Rule of Three, чтобы избежать этой проблемы оборванных указателей.
Если вам нужно явно объявить деструктор, скопировать конструктор или операцию назначения копии самостоятельно, вам, вероятно, необходимо явно объявить все три из них.
В вашем случае Вы не определяете оператор присваивания копии, что приводит к мелкой копии указателя.
Предлагаемое решение:
Если вы можете использовать std::string
вместо char *
просто использовать std::string
, он имеет в первую очередь предпочтение перед какой-либо глупой вещи указателя.
Вы можете избежать всех фанк-указателей, используя std::string
.
Если вы не можете прочитать, и следующее предложение относится к любому указателю класса вообще.
Обратите внимание, что идеальным решением здесь является не использование исходных указателей вообще. Всякий раз, когда вы используете необработанные указатели, вы вынуждены вручную управлять приобретенными ими ресурсами, всегда сложно и подвержено ошибкам вручную управлять ресурсами. Он должен избегать этого.
Чтобы сделать это, Вы должны использовать Smart pointer, который будет управлять динамической памяти указателя implicitly.Using смарт-указатель будет гарантировать, что динамическая память неявно освобожден после использования & вам не придется вручную управлять ,
Сценарий у вас есть причина того, что в C++ вы должны полагаться на RAII, а не ручное управление ресурсами & с использованием смарт-указатель является способ идти о в вашем случае.
Оговорка:
Обратите внимание, что я сдержался от предложения который умный указатель использовать, потому что выбор зависит скорее от собственности и жизни элементов, участвующих, что не видно из данных при условии, в Question.So я предлагаю читать,
Which kind of pointer do I use when?
, чтобы сделать ваш выбор смарт-указатель для использования.
Можете ли вы показать код? – cnicutar
Когда вы копируете экземпляр 'Person', у второго объекта есть ** его собственные ** члены. То есть он имеет свой собственный 'm_szFirstName', значение которого было скопировано из исходного экземпляра. Обратите внимание, что копируется только указатель, ** не указанная память **. Поэтому, когда вы удаляете первый экземпляр «NULL», второй сохраняет свое значение и указывает на «удаленную» память. – ereOn
код слишком большой, чтобы прикрепить сюда. Я хочу продемонстрировать, что вы не можете передать один объект (с данными char *) другому, если вы не переопределяете оператор присваивания и не делаете в нем копию. В противном случае данные двух объектов будут указывать на одну и ту же память. Когда первый объект будет удален, данные второго объекта будут повреждены. –