Что я думаю о том, что rvalue A
, возвращенный SetVar, является идентичной копией Class
и разделяет тот же указатель Var
. но когда rvalue вызывает его деконструктор, он удаляет Class
's Val
.возвращение * это; удаляет указатели
class A
{
private:
int* Var;
public:
A SetVar(int);
~A()
{
delete Var;
}
};
A A::SetVar(int NewVar)
{
Var=new int;
*Var=NewVar;
//POINT A
return *this;
}
int main()
{
A Class;
Class.SetVar(8);
//POINT B
}
В POINT A
*Val
равно 8, но в POINT B
*Val
равна -17891602
. Я также получаю _BLOCK_TYPE_IS_VALID (pHead-> nHeadUse) из-за попытки дважды удалить Val
.
Удаление деконструктора решает проблему, но создает утечку памяти.
Откуда вы знаете стоимость? Я чувствую, что вы считаете, что точка «B» на самом деле указывает «C» на другую сторону деструктора. Значение '-17891602' очень подозрительно выглядит« 0xFEEEFEEE ». См. Http://stackoverflow.com/a/127404/14065 Но есть и другие проблемы с кодом. –
Это в значительной степени пример учебника о том, почему вам нужно реализовать глубокую копию и правило из трех. Вам нужна копия этого учебника. –
Исправление учебника [правило три] (http://stackoverflow.com/a/4172724/636019). – ildjarn