gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:30 24 4
gpt4 key购买 nike

我正在用 C 写一个环形缓冲区。最后我坚持释放内存。代码编译良好,但结果显示 circBuf_free 函数无法释放分配的内存。相关代码为:

#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;
}

结果:

cb's value is 0x1266010

cb's value is 0x1266010

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

Aborted (core dumped)

指向结构的指针的地址是相同的。

需要帮助!

最佳答案

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.

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

关于C:分配给结构的空闲内存不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36131652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com