free function - Time & Space Complexity
Let's see how the time cost changes when we use the free function in C.
We want to know how long it takes to release memory as the size of the data grows.
Analyze the time complexity of the following code snippet.
int *arr = malloc(n * sizeof(int));
// ... use the array ...
free(arr);
This code allocates memory for an array of integers and then frees it.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The free function releases the allocated memory block.
- How many times: It is called once, regardless of the size of the memory block.
Freeing memory takes about the same time no matter how big the block is.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 |
| 100 | 1 |
| 1000 | 1 |
Pattern observation: The time to free memory stays roughly the same even if the size grows.
Time Complexity: O(1)
This means freeing memory takes a constant amount of time no matter how big the memory block is.
[X] Wrong: "Freeing a large block of memory takes longer than a small one."
[OK] Correct: The free function just marks the memory as available; it does not clear or process each byte, so the time does not grow with size.
Understanding how memory management functions like free work helps you write efficient programs and answer questions about resource handling clearly.
"What if we replaced free with a function that zeroes out the memory before freeing? How would the time complexity change?"
Practice
free function in C?Solution
Step 1: Understand what
Thefreedoesfreefunction releases memory that was allocated dynamically, returning it to the system.Step 2: Differentiate from other memory functions
mallocallocates memory,freereleases it. Copying or initializing pointers is unrelated.Final Answer:
To release memory previously allocated bymallocor similar functions -> Option DQuick Check:
free releases memory = A [OK]
- Confusing free with malloc or calloc
- Thinking free allocates memory
- Using free to copy data
malloc?Solution
Step 1: Free the allocated memory
Callingfree(pointer);releases the memory correctly.Step 2: Avoid dangling pointer
Settingpointer = NULL;after freeing prevents accidental use of freed memory.Final Answer:
free(pointer); pointer = NULL; -> Option AQuick Check:
Free then NULL pointer = D [OK]
- Calling free twice on the same pointer
- Incrementing pointer after free
- Reassigning pointer without freeing first
char *ptr = malloc(5);
strcpy(ptr, "test");
free(ptr);
printf("%s", ptr);Solution
Step 1: Analyze memory allocation and free
Memory is allocated and string "test" copied. Then memory is freed.Step 2: Using pointer after free
Printingptrafter free causes undefined behavior; it may print garbage or crash.Final Answer:
Undefined behavior (may print garbage or crash) -> Option BQuick Check:
Using freed pointer = undefined behavior [OK]
- Assuming freed pointer still holds valid data
- Expecting compilation error
- Thinking it prints empty string
int *arr = malloc(3 * sizeof(int)); free(arr + 1);
Solution
Step 1: Understand pointer passed to free
Memory was allocated atarr, but free is called onarr + 1, which is not the original pointer.Step 2: Free must be called on original pointer
Only the pointer returned by malloc (or NULL) can be passed to free safely.Final Answer:
free called on pointer not returned by malloc -> Option AQuick Check:
Free must use original pointer = A [OK]
- Freeing pointer offset from malloc result
- Not freeing allocated memory
- Assuming free can take any pointer inside block
int *resize(int *arr, int new_size) {
int *temp = realloc(arr, new_size * sizeof(int));
if (temp == NULL) {
free(arr);
return NULL;
}
return temp;
}What is the best practice to avoid memory leaks when using this function?
Solution
Step 1: Understand realloc behavior
If realloc fails, it returns NULL and original memory remains allocated.Step 2: Use temporary pointer to avoid losing original memory
Assign realloc result to a temp pointer first; if NULL, free original to avoid leaks.Final Answer:
Assign the return value to a temporary pointer before updating original pointer -> Option CQuick Check:
Use temp pointer for realloc to prevent leaks = B [OK]
- Overwriting original pointer without checking realloc result
- Freeing original pointer before realloc
- Ignoring NULL return from realloc
Ready to prove it?
Pass the test and this pattern moves unknown
