Вы не реализовали конструктор копирования (если это так, имейте в виду правило трех), поэтому, когда копии уничтожаются, вы освобождаете одну и ту же память несколько раз.
Подсказки:
Реализация конструктора копирования:
myclass(const myclass& other)
{
p = new int;
*p = *other.p;
}
Передача по ссылке:
int getval(const myclass& o);
Хорошее правило также состоит в том, чтобы сделать функции, которые не зависят от самого объекта, статическими (это не поможет вам в этом конкретном случае, но тем не менее полезно).Поскольку getval
не имеет доступа к элементам объекта, вы можете сделать его статическим.
Причины сбоя:
При вызове getval(o)
создается копия o
и его член указывает на то же место, что и исходный объект, так как вы не объявили конструктор копирования.Копия уничтожена, а память удалена.Исходный объект поврежден.