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
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.
Bir şekilde ayrılmış bellek salt okunu...
OS Bellek Uyarıları iPhone. Farklı Düz...
Nasıl " için SQL Server bir işlevi...
İşlevi modern platformlar için etkili ...
BcdDivide işlevi farklı Delphi XE ve X...