Как free() знает, сколько памяти нужно освободить?
Возможный дубликат:
Программирование на C: как free знает, сколько стоит free?
При программировании на С я часто используюmalloc()
выделить память и free()
выпустить это:
MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
/** Do stuff **/
free(objArr);
Как free()
знаете сколько памяти освободить? Есть ли malloc()
создать таблицу где-нибудь, чтобы запомнить указатели и сколько памяти указывал каждый указатель?
Если это так, будет free()
не удастся ли мне переименовать указатель? например:
MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
MyObject* newPtr= objArr;
free(newPtr); /** Does this fail? **/
Что произойдет, если я увеличу указатель, а затем выполню free()
? например:
MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
newPtr++;
free(newPtr); /** What happens now? **/
Освободит ли это дополнительный кусок памяти рядом с концом исходного массива?
1 ответ
Наиболее распространенным способом является то, что он хранит некоторую информацию непосредственно перед возвращением вам адреса. Таким образом, если malloc возвращает адрес 0x1004, внутренне malloc отложит память, начатую с 0x0FFC, и будет хранить различную информацию, такую как размер, где-то в памяти между 0xFFC - 0x1003, но приложению будет сообщено, что выделение начинается с 0x1004.
Единственное, что имеет значение для освобождения, это получение того же адреса, что и возвращенный malloc.