Monday 24 October 2016

c - How does free() know how much memory to deallocate?








When programming in C, I often usemalloc() to allocate memory and free() to release it:



MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
/** Do stuff **/
free(objArr);



How does free() know how much memory to deallocate? Does malloc() create a table somewhere to remember pointers and how much memory each pointer pointed to?



If that is the case, will free() fail if I rename the pointer? e.g.:



MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
MyObject* newPtr= objArr;
free(newPtr); /** Does this fail? **/



What will happen if I increment the pointer and then run free()? e.g.:



MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
newPtr++;
free(newPtr); /** What happens now? **/


Will it deallocate an additional chunk of memory just off the end of the original array?


Answer




The most common way is that it stores some information immediately before the address it returns to you. So if malloc returns the address 0x1004, internally, malloc will have put aside the memory started at 0x0FFC and will store various information such as the size somewhere in the memory between 0xFFC - 0x1003 but the application will be told the allocation starts at 0x1004.



The only thing that matters to free is getting the exact same address as what malloc returned.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...