C Programlamasında Bellek Sızıntısı Nedir?

C Programlamasinda Bellek Sizintisi Nedir



Programlamanın temelleri, özellikle yerleşik çöp toplayıcısı olmayan C gibi dillerde bellek yönetimini içerir. Bellek sızıntıları bu tür dillerde yaygın bir sorundur ve programın bellek yetersizliği nedeniyle program çökene kadar daha fazla bellek tüketmesine neden olurlar. Bir yazılım artık gerekli olmayan belleği serbest bırakamadığında, bellek tahsis edilir ve kullanılmaz, bu da bellek sızıntısı .

Bellek Sızıntısı Ne Zaman Oluşur?

Yazılım belleği ayırdıktan sonra, ancak onunla işi bittikten sonra serbest bırakmadığında, bir bellek sızıntısı . Bu, programın yeni değişkenler için daha fazla bellek ayırmaya devam ederken eski belleği ayrılmış ve kullanılmamış halde bıraktığı anlamına gelir. Bu, programın giderek daha fazla bellek kullanmasına neden olur ve sonunda, yetersiz bellek hatası nedeniyle program çöker.

C'de Bellek Sızıntısının Etkileri

Bellek sızıntıları bir programda birçok soruna neden olabilir. İşaretlenmezse, bir bellek sızıntısı programın çökmesine veya çalışmasının durmasına neden olarak veri kaybına veya bozulmasına yol açabilir. Ayrıca, program ihtiyaç duyduğundan daha fazla bellek tükettiği için sistem performansını etkileyebilir ve aynı sistemde çalışan diğer programları yavaşlatabilir.







C Dilinde Bellek Tahsisi

Bellek tahsisi, malloc() C Dili işlevi. Bu yöntem, belirtilen boyutta bir bellek bloğuna referans verir. İşaretçi değeri, ayrılan bellek bloğuna erişmek için kullanılır. Bellek gerekli olmadığında, kullanılarak serbest bırakılması gerekir. özgür() işlev.



Bellek Sızıntılarının Nedenleri

nedenlerinden bazıları bellek sızıntıları bunlar:



1: Uygun Olmayan Bellek Yönetimi

Bellek sızıntılarının en sık rastlanan nedeni, programlayıcı tarafında yetersiz bellek yönetimidir. Bu, bir program artık gerekli olmayan belleği serbest bırakmayı ihmal ettiğinde olur.





#include
#include

int ana ( )
{
int * puan = ( int * ) alışveriş merkezi ( boyutu ( int ) ) ;
* puan = 10 ;
printf ( '%D \N ' , * puan ) ;
puan = HÜKÜMSÜZ ;
geri dönmek 0 ;
}

Yukarıdaki kodda, kullanarak malloc() yöntemi puan işaretçi, bir tamsayı bellek bloğu için yer ayırdık. bu puan ayarladığımızda işaretçinin değeri değişir HÜKÜMSÜZ buna rağmen, daha önce atıfta bulunduğu bellek bloğu serbest bırakılmadı. Bu nedenle, bir bellek sızıntısı sonuçlanacak.

Çıktı



2: Kapsam Dışı Göstergesi

Bir işaretçi değişkeni kapsamı mevcut olduğunda, bir bellek sızıntısı C programlarında olur.

#include
#include

int ana ( )
{
int sayı1 = 32 , sayı2 = 23 ;
{
int * toplam = ( int * ) alışveriş merkezi ( boyutu ( int ) ) ;
* toplam = sayı1 + sayı2 ;
printf ( '%D \N ' , * toplam ) ;
}
printf ( '%D \N ' , * toplam ) ;
geri dönmek 0 ;
}

Yukarıdaki C programında, ana() işlev, bir tamsayı bellek bloğunu tahsis etmek için yerel bir kapsam kullanır. toplam işaretçi değişkeni. kullandığımızdan beri toplam a ve b'nin eklenmesini yeni oluşturulan bellek bloğuna atamak için işaretçi, bellek bloğu, blok kapsamı sona erdikten sonra bile sürekli olarak tahsis edilir. Bu nedenle, bir bellek sızıntısı gerçekleşecek.

Çıktı

C'de Bellek Sızıntılarının Tespiti

Tespiti ve önlenmesi bellek sızıntıları program istikrarını ve performansını korumak için kritik öneme sahiptir. Tespit etmek için bellek sızıntıları , programcılar gibi araçları kullanabilir seçim kapısı , bir bellek hata ayıklama ve profil oluşturma aracı. seçim kapısı bir programdaki tüm bellek erişimlerini izleyerek ve ayrılan belleğin ne zaman serbest bırakılmadığını belirleyerek bellek sızıntılarının belirlenmesine yardımcı olur.

C'de Bellek Sızıntılarını Önleme

Önlemek bellek sızıntıları , aşağıda verilen talimatları izleyin.

1: Her Zaman Tahsis Edilen Belleği Serbest Bırakın
Bellek her zaman açıkça kullanılarak serbest bırakılmalıdır. özgür() gibi bir işlev kullanılarak dinamik olarak tahsis edildikten sonra yöntem malloc(), calloc() veya realloc() . Bu sayede hafızanın sisteme geri dönmesi ve diğer kullanımlar için kullanılabilir olması sağlanır.

2: Ayrılan Belleği İzleme
Tahsis edilen belleğin izlenmesi, artık gerekli olmadığında serbest bırakıldığından emin olmak için önemlidir. Bu, ayrılan her belleği takip ederek ve artık ihtiyaç kalmadığında serbest bırakarak başarılabilir.

3: İşaretçileri Takip Edin
Bellek ayırmayı ve yeniden ayırmayı otomatik olarak yönetmek ve bellek sızıntılarını önlemek için işaretçiler izlenmelidir.

4: Statik Analiz Araçlarını Kullanın
Oluşturma zamanında, statik analiz araçları olası bellek sızıntıları Clang ve GCC gibi C programlarında. Uygulama çalıştırılmadan önce, bu araçlar olası bellek sızıntılarını belirlemede ve düzeltme önerilerinde bulunmada yardımcı olabilir.

Aşağıdaki örnek, yukarıdaki işlemi göstermektedir.

#include
#include
#include

int ana ( )
{
int * puan = ( int * ) alışveriş merkezi ( boyutu ( int ) ) ;
eğer ( puan == HÜKÜMSÜZ ) {
printf ( 'Bellek ayırma hatası. \N ' ) ;
geri dönmek 1 ;
}
* puan = 10 ;
printf ( '%D \N ' , * puan ) ;
özgür ( puan ) ;
geri dönmek 0 ;
}

Bu yukarıdaki kod, ilk olarak bellek tahsisinin başarılı olup olmadığını kontrol ederek, puan referans değil HÜKÜMSÜZ . Tahsis başarısız olursa kod hatayı uygun şekilde işleyebilir. Tahsis başarılı olursa, kod hafıza bloğuna bir değer verir. 10 ve çıktısını alır. Bundan sonra kod, kullanılarak ayrılan belleği serbest bırakır. özgür() işlev.

Çıktı

Çözüm

Bellek sızıntıları performans düşüşü ve çökmeler dahil olmak üzere programlarda önemli sorunlara neden olabilir. Bu tür sorunlar, dikkatli bellek yönetimi, uygun testler ve bellek kullanımının izlenmesi yoluyla belirlenebilir ve önlenebilir. Bu nedenle, programcılar bellek sızıntısı olasılığının farkında olmalı ve bunları önlemek için gerekli adımları atmalıdır.