SORU
7 HAZİRAN 2011, Salı


Nasıl bellek C kod/proje sızıntısı bulmak için?

Windows platformunda C programcı değilim. Visual studio 2008 kullanıyorum.

Ben genellikle bellek sızıntısı ile kod sonu.

Normalde normalde kodu inceleyerek bellek sızıntısı buluyorum, ama hantal ve iyi bir yaklaşım değildir her zaman.

Ödeme Gücüm yetmez bu yana bellek sızıntısı algılama aracı. Siz bellek sızıntısı önlemek için mümkün olan en iyi tavsiye almak istedim

  1. Programcı bellek sızıntısı bulmak için nasıl bilmek istedim.
  2. Orada herhangi bir standart veya prosedürü bir bellek programında sızıntı yok emin olmak için takip gerekir.

CEVAP
7 Aralık 2011, ÇARŞAMBA


Talimatları

Şey Gerekir

  • C yeterlik
  • C derleyici
  • Hata ayıklayıcı ve diğer araştırmacı yazılım araçları

1

Operatör temellerini anlamak. C operatörü "yeni" yığın bellek ayırır. "Delete" operatörü yığın bellek serbest bırakır. Her "yeni" sil aynı bellek serbest "ayrılmış: . bir kullanmalısınız

char* str = new char [30]; // Allocate 30 bytes to house a string.

delete [] str; // Clear those 30 bytes and make str point nowhere.

2

Eğer silinen varsa sadece bellek ayrılacak. Aşağıdaki kod, str ikinci tahsisi ile yeni bir adres aldı. İlk adres onarılamayacak şekilde kaybolur, ve böylece bu sivri 30 bayt. Şimdi ücretsiz olmazlar, ve bir bellek sızıntısı var:

char* str = new char [30]; // Give str a memory address.

// delete [] str; // Remove the first comment marking in this line to correct.

str = new char [60]; /* Give str another memory address with
                                                    the first one gone forever.*/

delete [] str; // This deletes the 60 bytes, not just the first 30.

3

Bu işaretçi atamaları izle. Her dinamik değişken (öbek üzerinde ayrılmış bellek) bir işaretçi ile ilişkilendirilmiş olması gerekir. Dinamik bir değişken işaretçi(ler) ilişkisiz olduğunda, imkansız silmek olur. Yine, bir bellek sızıntısı bu sonuçlar:

char* str1 = new char [30];

char* str2 = new char [40];

strcpy(str1, "Memory leak");

str2 = str1; // Bad! Now the 40 bytes are impossible to free.

delete [] str2; // This deletes the 30 bytes.

delete [] str1; // Possible access violation. What a disaster!

4

Yerel işaretçiler dikkat edin. İlan gösterici bir işlev yığında ayrılmış, ama işaret dinamik değişken öbek üzerinde tahsis edilir. Eğer silmek, yok eğer doğru değilse, program işlevden çıkar sonra devam eder

void Leak(int x){

char* p = new char [x];

// delete [] p; // Remove the first comment marking to correct.

}

5

"Sil." sonra köşeli parantez dikkat Kullanın "sil" tek başına bir nesne için ücretsiz. "" [] Yığın bir dizi serbest köşeli parantez ile. silmek için kullanın Böyle bir şey yapma:

char* one = new char;

delete [] one; // Wrong

char* many = new char [30];

delete many; // Wrong!

6

Eğer sızıntı henüz izin genellikle (burada kontrol edin: http://deleaker.com) deleaker ile arıyorum.

Teşekkürler!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012