SORU
17 HAZİRAN 2012, Pazar


Boş bellek farklı bir işlevi ayrılmış?

C öğrenmeye çalışıyorum ve şu anda bir temel veri yapısı stack hazırlamaya çalışıyorum, amamalloc/free temel hakkı elde etmek için görünmüyor olabilir.

İşte kod ben kullanarak (ben sadece bir mesaj, küçük bir kısmı burada göstermek için bir sorunla değil, toplam kodu ama hata mesajı tarafından oluşturulan sadece çalışan bu örnek kodu valgrind)

#include <stdio.h>
#include <stdlib.h>

typedef struct Entry {
    struct Entry *previous;
    int value;
} Entry;

void destroyEntry(Entry entry);

int main(int argc, char *argv[])
{
    Entry* apple;
    apple = malloc(sizeof(Entry));
    destroyEntry(*(apple));
    return 0;
}

void destroyEntry(Entry entry)
{
    Entry *entry_ptr = &entry;
    free(entry_ptr);
    return;
}

Ben --leak-check=full --track-origins=yes valgrind ile çalıştırdığınızda, aşağıdaki hata iletisini alabilirsiniz:

==20674== Invalid free() / delete / delete[] / realloc()
==20674==    at 0x4028E58: free (vg_replace_malloc.c:427)
==20674==    by 0x80485B2: destroyEntry (testing.c:53)
==20674==    by 0x8048477: main (testing.c:26)
==20674==  Address 0xbecc0070 is on thread 1's stack

Bu hata destroyEntry hafıza fonksiyonu açıkça ana ayrılmış değiştirmek için izin verilmez anlamına gelir bence. Bu doğru mu? Neden sadece 10 ** başka bir hafıza işlevi main ben ayrılmış olabilir mi? (bu davranış, ana bir şekilde belli mi?)

CEVAP
17 HAZİRAN 2012, Pazar


Bir işlev için bir parametre geçirmek için her bir kopyası oluşturulur ve işlevi bu kopya üzerinde çalışır. Senin durumunda, 12 ** mantıksız olan orijinal nesnenin bir kopyası için çalışıyoruz.

Eğer bir işlev işaretçisi almak için değiştirmeniz gerekir, ve sonra free doğrudan bir işaretçi çağırın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008