C'de bir proje geliştiriyorum ve ayrılan belleği boşaltmamalı ve ayrıca tüm açık dosyaları çıkmadan önce kapatmalıyım.Küresel değişkenler kullanmadan atexit veya benzer bir şekilde belleği boşaltmanın bir yolu var mı?
Tüm bu işleri yapacak ve atexit
numaralı telefondan arayabileceğiniz bir çok clean
işlevini uygulamaya karar verdim çünkü birçok olası çıkış senaryosu var.
Sorun, atexit
'un işlevlerin parametrelerle ayarlanmasına izin vermemesidir, bu nedenle işlemin sonunda serbest bırakılması gereken işaretçileri clean
gönderemiyorum.
Bu yüzden, global değişkenler olarak serbest bırakılması gereken her işaretçi ve programda açık kalabilecek her dosya olarak bildirmem gerekiyor mu? (Bunu zaten yaptım ama iyi görünmüyor) veya parametre göndermeye izin veren atexit
'a benzer bir işlev var mı? ya da daha çok, eksik olduğum başka bir yol var mı?
#include <stdio.h>
#include <stdlib.h>
void atexit_clean(void *data);
static void clean(void)
{
atexit_clean(NULL);
}
void atexit_clean(void *data)
{
static void *x;
if (data) {
x = data;
atexit(clean);
} else {
free(x);
}
}
int main(void)
{
int *a = malloc(sizeof(int));
atexit_clean(a);
return 0;
}
tek bir genel değişken kullanan diğer bir yöntem: bir işlev içinde statik işaretleyicinin kullanılması
Sadece bellek havuzuna işaret eden bir değişkene ihtiyacınız var. Bu kabul edilebilir görünüyor. – this
Modern bir tüketici işletim sistemindeyseniz, çıktığınızda tüm kaynaklar serbest bırakılır. Yani, tüm ayrılmış dosyalar boşaltılacak, tüm açık dosyalar kapatılacaktır, vb. –
Ayrıca, örn. Tüm süreç çalışma zamanı sırasında açık olması gereken dosyalar, sonra muhtemelen birden fazla yerde erişebilirsiniz, ve bu zaten bir global değişken veya en azından bir çeviri biriminde global olduğu anlamına gelir ve daha sonra yalnızca bir kapatma işlevine sahip olabilirsiniz. global 'clean_all' işlevinden çağrılan dosya. Tahsis ettiğin bellekle aynı. –