Следующий фрагмент кода - это упрощенная версия проблемы, которую я имею в визуальной студии.Вне области до возврата
Код ввода деструктор во
return temp;
отладки пошагового.
Код:
class point2d
{
public:
int x, y;
};
class poly2d
{
public:
void operator=(const poly2d& temp)
{
for (cnt = 0; cnt < pointNum; ++ cnt)
{
p[cnt].x = temp.x;
p[cnt].y = temp.y;
}
}
poly2d(int size);
~poly2d();
point2d* p;
int pointNum;
};
poly2d::poly2d(int size)
{
pointNum = size;
p = new point2d[size];
}
poly2d::~poly2d()
{
if (p)
{
delete[] p;
p = 0;
}
}
poly2d copy();
int main()
{
poly2d myPoly(5);
myPoly = copy();
return 1;
}
poly2d copy()
{
poly2d temp(5);
return temp;
}
Я знаю, эта часть не имеет никакого смысла, но это упрощено и из контекста, но в то же время подчеркивает мою проблему. Деструктор выполняется перед оператором return. Затем следует конструктор копирования, затем деструктор снова. Он дважды удаляется и вызывает ошибки. Это первый раз, когда я столкнулся с этой проблемой в течение 6 лет.
Спасибо.
Это потому, что у вас нет правильного конструктора копий или оператора присваивания. Другие объяснят специфику. Если вы использовали 'std :: vector', тогда все будет работать.Вам даже не нужно было бы предоставлять деструктор. Пусть язык сделает для вас тяжелую работу. –
Какой деструктор вы имеете в виду? Локальный объект 'temp', конечно же, уничтожается, как только он выходит за рамки. – user463035818
Вы возвращаетесь по значению. Вы даже назвали объект 'temp'. Почему вы думаете, что это не должно быть разрушено? Ваши ошибки не имеют ничего общего с «выходом из сферы действия» - они из-за вас нарушают правило нуля/три/пять. –