I am creating a class that works similar to the string class. I am in a starting stage doing some experiments.
Assume all header files are added
class String { public: int len; char *str = NULL; // Default constructor String() { len = 0; str = new char[1]; str[0] = '\0'; printf("New memory: %p\n", str); } // Copy constructor String(const char *ch) { len = strlen(ch); if (str != NULL) { printf("Old memory: %p\n", str); delete str; printf("Deleted...\n"); } str = new char[len + 1]; printf("New memory: %p\n", str); for (int i = 0; i <= len; i++) str[i] = ch[i]; } }; int main() { String msg; std::cout << msg.len << std::endl; std::cout << msg.str << std::endl; msg = "Hello"; std::cout << msg.len << std::endl; std::cout << msg.str << std::endl; } When I create a String object 1 byte of memory is allocated to store string and initialises with \0 on line String msg;
When copy constructor is called on line msg = "Hello"; it first checks for any previous allocation of memory and to avoid memory wastage it will delete that and recreates a new memory block.
The issue is when copy constructor is called line if (str != NULL) is not getting executed. It should execute because str is allocated a byte of memory earlier in default constructor and it is not NULL.
What may be the thing that I missed out?
const char*. A copy constructor would have the signatureString(const String& other)String(const char*)yourStringis in the same state as if you just enteredString(). That meansstr == NULL. Also usenullptrinstead.