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.
You mistake two things: making pointer point to something different (this is what assignment does) and copying some data to a place pointed by pointer.
this code makes
at
point to a literal "tw" created somewhere in read-only memory. Trying to write to it is an undefined behaviour.this code allocates memory for three chars and makes
at
point to this part of memory (line 1) and then copies some data to memory pointed byat
.And remember, that memory allocated with
new[]
should be deallocated withdelete[]
, notdelete
I advice you to learn more about pointers. This discussion covers this.
In the first example, you have caused a memory leak.
Your variable
at
is a pointer to a memory address, not the string itself. When you assign the address of"tw"
to the pointer, you have lost the original address that you got withnew
.at
now points to an address that you did not allocate withnew
, so you cannotdelete
it.If you think of pointers as integers, it will probably make more sense. I've assigned arbitrary numbers as addresses for the sake of discussion.
There are 3 things to understand:
1)
char *at;
is just a pointer variable.A pointer variable simply means that it holds a memory address.
2)
new char[3]
returns the starting address of the memory allocated on the heap.3)
"hello"
returns the address of the string literal.A note about modifying read only memory:
Also you should never be modifying a string literal. I.e. this should never be done:
The memory for string literals must be read only and if you change it, the results are undefined by the C++ language.
Since you're using C++:
Since you're using C++ please consider using the
std::string
type instead.Do not forget to use
whenever you are allocating something with [].
In the first example you are chaning the value at, in the second you are changing the value of what at points to. Assigning a char * to a double quoted string assigns it to a static const pointer.
In particular, in the first example at now points a different location in memory.
In your first example you are allocating some memory and pointing to it with the "at" variable. When you do
you are effectively re-pointing the char * to a constant character string. This causes you to leak memory. When you go on to delete "at" you are attempting to delete stack memory.
strcpy goes through each character and copies their values to the new memory you allocate. This is also known as a deep copy.