-1

Why does value k change, after the second call of check(base)?

class Base{
public:
    int k=0;
    virtual void print(){
        cout<< k<<endl;
    }
};

Base* check(Base* p){
   Base* t = new Base;
   t->k = 4;
   delete p;
   return t;
}

int main(){
    Base* base = new Base;
    cout<< check(base)->k; // first call, print 4
    cout<<"\n";
    cout<<base->k;// print 0
    check(base); // second call
    cout<<"\n";
    cout<< base->k; // print 4
    cout<<"\n";
    return 0;
}

Ouput:

4
0
4
fva
  • 33
  • 4

1 Answers1

0

Accessing memory pointed by ptr after delete ptr is UB

My guess in your case is that after you invoke delete p (a.k.a. base),
Base* t = new Base allocates memory where base used to point at.