2011-08-16 15 views
5

alıyorum sorunları kullanarak boşaltma sonra bir işaretçi kullanarak: Ben bir segment hataya alıyorumaşağıdaki kod tipi ile serbest()

int* myPointer1 = malloc(50 * sizeof(int)); 
int* myPointer2 = malloc(50 * sizeof(int)); 
free(myPointer1); 
myPointer1 = myPointer2; 
myPointer1[0] = 3; 

. Sorun ne?

+5

Malloc işlemlerinin başarılı olduğundan emin olmak için kontrol ettiniz mi? eğer olmasa da myPointer1'i NULL olarak atayabilirsiniz. – djhaskin987

+0

Nerede segfault musunuz? 'Free (myPointer1)' veya 'myPointer1 [0] = 3' 'de mi? – Seth

+0

Eğer malloc başarılı olursa segfault olmamalıdır. Yaptığınız tek şey, "myPointer1" in orijinal belleğinde hafızayı boşaltmak ve myPointer1'i myPointer2'nin yerine yeniden atamaktır. Ancak, bu son belleği biraz boşaltacaksanız, aynı adrese işaret ettiğinden yalnızca işaretçilerden (yani "myPointer1" VEYA "myPointer2") birini boşaltmak isteyeceksiniz. – RageD

cevap

3

Sorun bu kodda değil. Gönderdiğiniz snippet'in doğru olduğu ve yalıtım açısından iyi çalıştığını.

+0

Kod pasajı doğru olduğundan, doğru olduğu için doğru değil, çünkü bir UB ile bile çok iyi çalışabilir ve en azından bunu beklediği anda patlayabilir. –

+2

"Kod pasajı doğru olduğundan doğrudur" -> http://xkcd.com/703/ =) – jadarnel27

+2

Doğru olduğunu söylemedim, çünkü işe yaradı - Doğru olduğu ortaya çıktı (örneğin, Belirgin tanımlanmamış bir davranış içermez), * ve * çalışır (örneğin, segmentasyon fay hacmini bildirmedim). – duskwuff

2

Kodunuz yanlış bir şey değil, ancak malloc() işlevinin dönüş değerini test etme alışkanlığı yaratıyorsunuz, eğer NULL ise programınızda sorun yaratacaktır, bizim durumumuzda bellek ayırma malloc() işlevi başarısız oldu