Удалить [] после того, как strcpy вызовет утечку памяти?

char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);

...

delete[] myChar;

Мой вопрос, если strcpy ставит '\0' в конце "123"тогда будет delete[] myChar удалить только первые 3 символа и не удастся удалить остальные myChar?

Спасибо…

2

Решение

Нет, delete [] освобождает всю память, выделенную new [] до тех пор, пока вы передаете тот же адрес delete [] который был возвращен new [],
Он просто правильно запоминает, сколько памяти было выделено независимо от того, что находится в этой памяти.

3

Другие решения

Ваш delete [] освобождает все 20 символов, а не только 3 + 1, которые вы действительно использовали.

1

Delete не ищет «\ n» при удалении строки символов.

Скорее компилятор ищет «\ n» при выделении фрагмента памяти для вашей строки.

Следовательно, удаление как myChar, так и myChar2 будет работать точно так же, если посмотреть на размер фрагмента памяти, который фактически был выделен для конкретного указателя. Это исключает утечки памяти в вашей ситуации.

1

Это фундаментальный аспект 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);

Вам нужно отслеживать сам объект (т.е. как он был расположен), а не место, где вы храните указатель на этот объект. И освободите объект, который вы хотите освободить, а не место, в котором хранится информация об этом объекте.

1
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
1
По вопросам рекламы [email protected]