I am having doubt in the below code,that in the absence of a copy constructor default copy constructor invokes and does a shallow copy,after which str1.s and str2.s both are pointing to string "GeekQuiz".
But after i delete str2.s its destruct-or gets called and sets it to NULL,but str1.s is still pointing to freed memory.
Now when i allocate a new string "GeeksforGeeks"and point str2.s to it , i dont understand why str1.s is also pointing to same new string "GeekforGeek"
 #include < iostream >
 #include < cstring >
 using namespace std;
 class String
 {
     private:
     char *s;
     int size;
  public:
     String(const char *str = NULL); // constructor
     ~String() { delete [] s;  }// destructor
     void print() { cout << s << endl; }
     void change(const char *);  // Function to change
 };
 String::String(const char *str)
 {
     size = strlen(str);
     s = new char[size+1];
     strcpy(s, str);
 }
 void String::change(const char *str)
 {
    delete [] s;
    size = strlen(str);
    s = new char[size+1];
    strcpy(s, str);
 }
 int main()
 {
      String str1("GeeksQuiz");
      String str2 = str1;
      str1.print(); // what is printed ?
      str2.print();
      str2.change("GeeksforGeeks");
      str1.print(); // what is printed now ?
      str2.print();
      return 0;
    }
