#c #pointers #calloc
#c #указатели #calloc
Вопрос:
Что происходит, когда я использую разные последовательные функции calloc по одному и тому же указателю?
int *ptr;
ptr = (int *) calloc(X, sizeof(int));
ptr = (int *) calloc(Y, sizeof(int));
ptr = (int *) calloc(Z, sizeof(int));
Где X, Y, Z — это три разных значения.
Комментарии:
1. Что вы имеете в виду, можете ли вы привести пример?
2. Вы имеете в виду присвоение результатов двух calloc() одной и той же переменной типа void * ?
3. Вам нужно опубликовать пример. Вы можете вызывать
calloc
по одному и тому же указателю сколько угодно, если у вас естьfree
память, на которую в данный момент указывает указатель, или вы делаете копию указателя перед перераспределением.4. Отредактировано, понимаете, что я имею в виду?
Ответ №1:
Вы потеряете соединение с ранее выделенной памятью и больше не сможете ее освободить — утечка памяти
Комментарии:
1. итак, по сути, эта память все еще занята исполняемым файлом, но нет возможности получить к нему доступ?
2. Эта память выделена в куче, и у вас нет указателя на нее, так что да, то, что вы сказали.
3. @Andrew — единственная запись, имеющаяся в системе, память о которой была предоставлена вам, — это указатель. Он ничего не может освободить, если вы не вернете ему тот же указатель — так что он знает, что вы закончили с этой памятью
Ответ №2:
Вы теряете ранее выделенную память, если теряете средства для ее освобождения.
Комментарии:
1. @DanielEarwicker Хороший улов. Я изменил «с тех пор» на «если».
2. «и», а не «если». Это не вероятность, это определенность!
Ответ №3:
То же самое происходит, когда вы снова и снова присваиваете значение int
переменной (с дополнительной проблемой утечки памяти)
int i;
i = 42;
i = 0; // where's the 42?
i = 1; // where's the 42? and the 0?
i = 42; // where's the 42? -- Oh! I see it! :) -- and the 0? and the 1?
Комментарии:
1. Это кажется немного неловким, утекают ли повторяющиеся назначения переменной 16 бит памяти?
2. Никаких потерянных битов, вы просто теряете значение. С
int
нет дополнительной проблемы потери значения… с помощью указателей, если вы теряете значение, вы также теряете память, на которую оно указывает.3. И что происходит с этими блоками памяти? Переносятся ли они в другую программу или они остаются в рамках программы, которая определила их в первую очередь, до конца? Если нет, то какова цель
free()
функции?4. @AndrewG.H. Память остается заблокированной в вашей программе до ее завершения. Цель
free
— ускорить процесс «Я собираюсь еще немного поработать, но мне не понадобится эта память». Объяснение pmg хорошее, оно в основном связано с потерей значения.5. @pmg и cnicutar: тогда я должен опровергнуть вашу аналогию с переменной типа int. Из того, что вы говорите, вы автоматически противоречите сами себе, потому что для переменной int при переназначении новое значение сохраняется в тех же банках памяти, в то время как повторный вызов резервирует новые банки памяти для программы, соответственно для указателя, зависающего на предыдущих банках памяти программой.