The first example does not work when you go to delete the pointer. The program either hangs when I add the null terminator or without it I get:
Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
from Visual Studio 2008
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
So what's going on when I use double quotes instead of strcpy? Both of them will cout the string perfectly and debugger does not show anything different.
When you do
char *at = ...;
at = "hello";
You're basically overwriting the pointer value (i.e., the address of the memory allocated for you by new[]
) with the address of a static constant string. This means that when you later delete that memory, you're passing delete
a pointer not previously returned by new
.
That is a bad thing to be doing.
In C and C++, assignments to pointers typically don't do anything to the memory being pointed at, they change the pointer itself. This might be confusing if you're used to a language where strings are more of "first class citizens".
Also, you should use delete[]
if you used new[]
.