Проблема, с которой вы сталкиваетесь, - это двойное удаление. Поскольку вы не определили каких-либо конструкторов копий, здесь C++ счастливо делает это для вас. Реализация делает это, выполняя мелкую копию всего содержимого.
f(x);
Эта линия работает путем создания копии x
и передавая ее f
. На данный момент есть 2 temp
экземпляров, в которых есть один член intPtr
. Оба экземпляра удаляют этот указатель, и это, скорее всего, приводит к вашему сбою.
Чтобы обойти эту проблему вы можете предпринять ряд шагов
- Используйте тип указателя, предназначенную для совместного использования, как
shared_ptr<T>
- Создание uncallable конструктор копирования, который заставляет экземпляр должен быть принят исх
пример # 2
class temp {
temp(const temp& other);
temp& operator=(const temp& other);
public:
// Same
};
Теперь строка f(x)
просто не будет компилироваться, потому что она не может получить доступ к нужному конструктору копирования. Это заставляет его переопределить f
, чтобы предотвратить копирование.
void f(const temp& fInput) {
...
}
Можете ли вы определить "крушение"? – josephthomas
@ Ed S: Я согласен, однако, иногда то, что мы определяем как крушение, может отличаться от того, что, по его мнению, является крахом. – josephthomas
@josephthomas: Да, я так понял, поэтому я удалил свой комментарий вскоре после его публикации :) Мы можем договориться о правильном использовании этого термина ... независимо от того, будут ли его начинающие использовать или нет, это еще одна проблема –