1

I am writing a ring buffer with C. I am stuck on freeing the memory in the end. The code compiles well, but the result shows circBuf_free function fails to free the allocated memory. The relevant codes are:

#include <stdint.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //memcpy

#define kNumPointsInMyBuffer 16 
#define initialSize 10


typedef struct CircBuf_t //struct name CircBuf_t
{
    uint32_t *buffer;
    int head; // keep track the newest data
    int tail; // keep track the oldest data
    int maxLen; // maximum number of items in the buffer
}circBuf_t; //type name circBuf_t


 // initialize the circular buffer
void circBuf_init(circBuf_t *c, const int maxLen, int sz)
{
    c->buffer = malloc(maxLen * sz);
    c->maxLen = maxLen;
    if(c->buffer == NULL)
    printf("Buffer initialization fails\n");
    c->head = 0;
    c->tail = 0;
}

/* free the memory, free c->buffer first, then c*/
void circBuf_free(circBuf_t *c){
    free(c->buffer);
    free(c);
}


int main(){
// initilize ring Buffer    
const int maxLen = kNumPointsInMyBuffer;

// original src
int src[1024] = {};
int i =0;
for(i=0; i<1024; i++){
    src[i] = i;
}

//data
uint32_t data[1024];    
memcpy(data, src, 1024);

printf("\nThe size of the uint32_t data array is %lu\n", sizeof(data));
int sz = sizeof(*data);

circBuf_t *cb;
cb = malloc(sizeof(circBuf_t));
circBuf_init(cb, maxLen, sz);



assert(cb);
printf("cb's value is %p\n", cb);
circBuf_free(cb);
printf("cb's value is %p\n", cb);
assert(!cb);

return 0;
}

Result:

cb's value is 0x1266010

cb's value is 0x1266010

a.out: sample.c:73: main: Assertion `!cb' failed.

Aborted (core dumped)

The address of the pointer to the structure is the same.

Need help!

2
  • 4
    It is expected to be the same. Freeing memory only frees memory, it does not modify any of your variables. Commented Mar 21, 2016 at 12:59
  • @molbdnilo thanks. But if so, how I can have an evidence that the free function has worked? Commented Mar 21, 2016 at 13:11

1 Answer 1

1

When you call free, the memory pointed to by the passed pointer is freed, but the value of the pointer in the caller probably remains unchanged, because C's pass-by-value semantics mean that called functions never permanently change the values of their arguments. (See also question 4.8.)

A pointer value which has been freed is, strictly speaking, invalid, and any use of it, even if it is not dereferenced (i.e. even if the use of it is a seemingly innocuous assignment or comparison), can theoretically lead to trouble. (We can probably assume that as a quality of implementation issue, most implementations will not go out of their way to generate exceptions for innocuous uses of invalid pointers, but the Standard is clear in saying that nothing is guaranteed, and there are system architectures for which such exceptions would be quite natural.)

When pointer variables (or fields within structures) are repeatedly allocated and freed within a program, it is often useful to set them to NULL immediately after freeing them, to explicitly record their state.

Source : http://c-faq.com/malloc/ptrafterfree.html

Sign up to request clarification or add additional context in comments.

1 Comment

thanks a lot! so the value of the pointer is unchanged, but the memory has been released. This just doesn't set my mind at ease.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.