Повторный вызов по одному и тому же указателю

#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 при переназначении новое значение сохраняется в тех же банках памяти, в то время как повторный вызов резервирует новые банки памяти для программы, соответственно для указателя, зависающего на предыдущих банках памяти программой.