2016-03-21 16 views
1

C. ile bir zil belleği yazıyorum Sonunda belleği boşaltmaya takılıyorum. Kod, iyi derler, ancak sonuç, ayrılmış belleği boşaltmak için circBuf_free işlevinin başarısız olduğunu gösterir. ilgili kodlar şunlardır:C: bir yapıya ayrılan boş bellek çalışmıyor

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

Sonuç: sample.c: 73: ana: Onaylama

CB'nin değeri 0x1266010

CB'nin değeri 0x1266010

a.out mesafesindedir `! cb 'başarısız oldu.

Kesildi (çekirdek döküldü)

yapıya ibrenin adresleri aynıdır.

Yardım gerekiyor! özgür çağırdığınızda

+4

Aynı olması bekleniyor. Hafızayı serbest bırakmak sadece belleği boşaltır, değişkenlerinizden hiçbirini değiştirmez. – molbdnilo

+0

@molbdnilo Teşekkürler. Ama eğer öyleyse, serbest fonksiyonun işe yaradığına dair bir kanıt bulabilir miyim? – ulyssis2

cevap

1

, hafıza arındırılır geçirilen gösterici ile gösterilen, ancak C'nin pass-by-value semantik fonksiyonları denilen anlamına çünkü arayanın ibrenin değeri muhtemelen değişmeden kalır asla argümanlarının değerlerini kalıcı olarak değiştirmez. (Aynı zamanda 4.8 soru bakınız.)

katı, konuşma geçersiz ve herhangi bir kullanımı, serbest bırakılmış bir işaretçi değerini, bunun içinde kullanımı, yani bile (duruma gelmiş olsa bile görünüşte zararsız ödev veya karşılaştırma), olabilir teorik olarak sorunlara yol açabilir. ( uygulama sorununun kalitesi olarak, çoğu uygulamanın geçersiz işaretçisinin zararsız kullanımları için istisnalar oluşturmak üzere yollarının dışına çıkmayacağını varsayabiliriz, ancak Standart, hiçbir şeyin garantili olduğunu açık olarak belirtti ve sistem yapıları olan bu durumlar oldukça doğal olurdu bulunmaktadır.) yapıları içinde değişken ibresi (ya da alanı), art arda zaman

bir program dahilinde tahsis serbest, serbest bıraktıktan sonra hemen NULL olanağına ayarlamak için genellikle kullanışlıdır Onları, durumlarını açıkça kaydetmek için.

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

+1

çok teşekkürler! işaretçinin değeri değişmez, ancak bellek serbest bırakıldı. Bu sadece fikrimi kolaylaştırmıyor. – ulyssis2