По free
память только что освобождена от использования.Это освобождено от того, чтобы быть выделенным вам.это явно не очищается.Некоторое старое содержимое может присутствовать в этих местах памяти.Чтобы избежать этого, есть два решения.
Решение 1:
Вам нужно будет сделать memset
после выделения памяти, используя malloc
.
Пример кода:
unsigned int len = 20; // len is the length of boo
char* bar = 0;
bar= (char *)malloc(len);
memset(bar, 0, len);
Решение 2:
Или используйте calloc()
, который по умолчанию инициализирует память до 0
.
КодПример:
int *pData = 0;
int i = 10;
pData = (int*) calloc (i,sizeof(int));
Я думаю, что delete[]
в c ++ не имеет этой проблемы.
Нет
Он ведет себя точнотаким же образом.Если вы явно не установите указатель на 0
, указатель delete
не будет указывать на 0
.Поэтому всегда устанавливайте указатель на 0
после его удаления.
Когда следует использовать malloc
сверх calloc
или наоборот?
Поскольку calloc
устанавливаетвыделенная память для 0
это может занять немного времени, поэтому вы, возможно, захотите использовать malloc()
, если эта производительность вызывает проблемы.
Если инициализация памяти более важна, используйте calloc()
, поскольку она делает это явно для вас.
Кроме того, некоторые ОС, такие как Linux, имеют модель памяти Lazy Allocation , в которой возвращаетсяадрес памяти является виртуальным адресом, и фактическое выделение происходит только во время выполнения.ОС предполагает, что она сможет обеспечить это распределение во время выполнения.
Память, выделенная malloc
, не поддерживается реальной памятью до тех пор, пока программа не коснется ее.
Покатак как calloc
инициализирует память на 0
, вы можете быть уверены, что ОС уже поддержала выделение с фактической оперативной памятью (или подкачкой).
Как насчет realloc
?
Да, поведение, аналогичное malloc
.
Выдержка из документации :
void * realloc ( void * ptr, size_t size );
Перераспределить блок памяти
Размер блока памяти, на который указывает параметр ptr, изменяется на размер в байтах, увеличивая или уменьшая объем памятидоступны в блоке.
Функция может переместить блок памяти в новое место, и в этом случае возвращается новое место. Содержимое блока памяти сохраняется до меньшего из новых и старых размеров, даже если блок перемещается. Если новый размер больше, значение вновь выделенной части является неопределенным.
В случае, если ptr равен NULL, функция ведет себя точно так же, как malloc, присваивая новый блок байтов размера и возвращая указатель на его начало.
В случае, если размер равен 0,память, ранее выделенная в ptr, освобождается, как если бы был сделан вызов free, и возвращается указатель NULL.