简体   繁体   English

C:分配给结构的空闲内存不起作用

[英]C: free memory allocated to a struct doesn't work

I am writing a ring buffer with C. I am stuck on freeing the memory in the end.我正在用 C 编写一个环形缓冲区。我最终坚持要释放内存。 The code compiles well, but the result shows circBuf_free function fails to free the allocated memory.代码编译良好,但结果显示circBuf_free函数无法释放分配的内存。 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 的值为 0x1266010

cb's value is 0x1266010 cb 的值为 0x1266010

a.out: sample.c:73: main: Assertion `!cb' failed. a.out: sample.c:73: main: 断言 `!cb' 失败。

Aborted (core dumped)中止(核心转储)

The address of the pointer to the structure is the same.指向结构的指针的地址是相同的。

Need help!需要帮忙!

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.当您调用 free 时,传递的指针指向的内存被释放,但调用者中指针的值可能保持不变,因为 C 的值传递语义意味着被调用函数永远不会永久更改其参数的值。 (See also question 4.8.) (另见问题 4.8。)

A pointer value which has been freed is, strictly speaking, invalid, and any use of it, even if it is not dereferenced (ie 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.当指针变量(或结构中的字段)在程序中重复分配和释放时,在释放它们后立即将它们设置为 NULL 以显式记录它们的状态通常很有用。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM