2016-06-19 3 views
-2

Я разрабатываю проект C, и выясняется, что в определенный момент я вызываю функцию calloc() и назначает блок памяти, который уже используется. Как это возможно? Я проверил свои распределения памяти и каждый раз, когда я вызываю malloc/calloc, я звоню бесплатно (pointer_to_the_allocated_memory). Таким образом, это не проблема утечки памяти, а не двукратный указатель. Я не вставляю свой код, поскольку он предназначен для работы с коллегами, и я еще не отправил его. Приветствуется любой тип помощи/совета. Спасибо заранее.Calloc() присваивает ранее назначенную память

+0

Попробуйте использовать что-то вроде Valgrind для отслеживания/Debug использования памяти. –

+0

Обратите внимание, что каждая программа имеет собственное пространство виртуальной памяти. – sjsam

+1

Не могли бы вы разместить что-то похожее на оригинал? Есть много людей, которые спрашивают про собственный код, который они не хотят делиться напрямую, но обычно приводят пример. Можете ли вы воссоздать ситуацию в меньших масштабах? –

ответ

1

Возможно, что два указателя указывают на одно и то же место.

p1 = malloc(sizeof(int)); 
/* ... */ 
p2 = p1; 
/* ... */ 
free(p1); 
/* ... */ 
p3 = malloc(sizeof(int)); /* may allocate the block already used by p2 */ 

Обратите внимание, что это часто не так очевидно. Это может произойти с помощью арифметики указателей (т. Е. p2++), или различные части этого могут быть выполнены в разных функциях.

Другая возможность заключается в том, что вы освобождаете указатель, не замечая этого:

p1 = malloc(sizeof(int)); 
foo(p1); /* this function calls free(p1) */ 
p2 = malloc(sizeof(int)); /* may allocate the block already used by p1 */ 
+1

Следует помнить, что, хотя это возможно, это маловероятно, и нет никакого способа узнать, что сценарий, который вы написали, произойдет. Это очень специфическая реализация компилятора. – Nava2

+1

Учитывая, что calloc() «назначает блок памяти, который уже используется», это вполне вероятно. Чтобы назначить блок памяти, который используется, блок должен быть либо освобожден, либо не назначен. – user31264

+0

Спасибо за ответ user31264 – mariano

Смежные вопросы