char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);
...
delete[] myChar;
Мой вопрос, если strcpy
ставит '\0'
в конце "123"
тогда будет delete[] myChar
удалить только первые 3 символа и не удастся удалить остальные myChar
?
Спасибо…
Нет, delete []
освобождает всю память, выделенную new []
до тех пор, пока вы передаете тот же адрес delete []
который был возвращен new []
,
Он просто правильно запоминает, сколько памяти было выделено независимо от того, что находится в этой памяти.
Ваш delete [] освобождает все 20 символов, а не только 3 + 1, которые вы действительно использовали.
Delete не ищет «\ n» при удалении строки символов.
Скорее компилятор ищет «\ n» при выделении фрагмента памяти для вашей строки.
Следовательно, удаление как myChar, так и myChar2 будет работать точно так же, если посмотреть на размер фрагмента памяти, который фактически был выделен для конкретного указателя. Это исключает утечки памяти в вашей ситуации.
Это фундаментальный аспект C ++, который требует понимания. Это вызывает путаницу, которая имеет свои основания. Посмотрите пример:
char* myChar1 = new char[20];
char* myChar2 = (char*)malloc(20);
Несмотря на то, что оба указателя имеют одинаковый тип, вы должны использовать разные методы для освобождения объектов, на которые они указывают:
delete [] myChar1;
free(myChar2);
Обратите внимание, что если вы делаете:
char *tmp = myChar1;
myChar1 = myChar2;
myChar2 = myChar1;
После этого вам нужно:
delete [] myChar2;
free(myChar1);
Вам нужно отслеживать сам объект (т.е. как он был расположен), а не место, где вы храните указатель на этот объект. И освободите объект, который вы хотите освободить, а не место, в котором хранится информация об этом объекте.
char* myChar=new char[20]; // you allocate 20 space for 20 chars
+-----------------+
myChar -> | x | x | ... | x | // x = uninitialized char
+-----------------+
char* myChar2="123";
+----------------+
myChar2 -> | 1 | 2 | 3 | \0 | // myChar2 points to string
+----------------+
strcpy(myChar, myChar2); // copy string to 20 char block
// strcpy copies char by char until it finds a \0 i.e. 4 chars
// in this case
+----------------------------------+
myChar -> | 1 | 2 | 3 | \0 | x | x | ... | x |
+----------------------------------+
// note that characters after the string 123\0 are
// still uninitialized
delete[] myChar;
// the whole 20 chars has been freed