I have a class that contains the operator + () to add 2 objects. The class contains an attribute char * variable str that points to an allocated char array from new char[] that contains a C style text string. I want the operator +() to concatenate two char arrays into a third char array allocated as a new buffer sized to contain the concatenated string as the result of the operator.
I am using overloaded constructor and initializing list and I initialize the variable to a default value. The destructor I've added to the class frees the memory allocated for the object text buffer in the char *str variable.
Everything works perfectly fine WITHOUT the class destructor, but as soon as I add the destructor, the program prints weird characters. I am also seeing a memory leak.
Here is the code and note that the class destructor is included here!
#include <iostream>
#include <cstring>
#include<cstring>
class Mystring {
private:
    char *str;      
public:
    Mystring():
        str{nullptr} {
        str = new char[1];
        *str = '\0';
        }
    Mystring(const char *s):
         str {nullptr} {
        if (s==nullptr) {
            str = new char[1];
            *str = '\0';
        } else {
            str = new char[std::strlen(s)+1];
            std::strcpy(str, s);
        }
    }
    Mystring(const Mystring &source):
        str{nullptr} {
        str = new char[std::strlen(source.str)+ 1];
        std::strcpy(str, source.str);
        std::cout << "Copy constructor used" << std::endl;
    }
    ~Mystring(){
          delete [] str;
    }
    void print() const{
          std::cout << str << " : " << get_length() << std::endl;
    }
    int get_length() const{
        return std::strlen(str); 
    }
    const char *get_str() const{
        return str;
    }
    Mystring&operator+(const Mystring &dstr)const;
};
// Concatenation
Mystring &Mystring::operator+(const Mystring &dstr)const {
    char *buff = new char[std::strlen(str) + std::strlen(dstr.str) + 1];
    std::strcpy(buff, str);
    std::strcat(buff, dstr.str);
    Mystring temp {buff};
    delete [] buff;
    return temp;
}
int main() {
    Mystring m{"Kevin "};
    Mystring m2{"is a stooge."};
    Mystring m3;
    m3=m+m2;
    m3.print();
    return 0;
}
 
     
     
    