Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
4
Cevap
1306
Tıklama
0
Öne Çıkarma
C++ Array Deallocate
:
15 yıl (849 mesaj)
Yüzbaşı
Konu Sahibi

Tekrar merhaba.

Elimde 2 adet class var. Biri B biri A olsun.
B classı oluşturulurken içerisinde A tipinden classların bulunduğu array tutuyor. Bu arrayin boyutu başlangıçta belli olmadığı için new komutu ile alıyorum.
Destructorları yazdım ve B classına ait destructor içerisinde
delete [] a; //a= A classına ait arrayin adı
bir çağrı yaptığım zaman A classına ait eleman sayısı kadar destructor çağrılmıyor. Yani memory leak var ortada.

İnternetten biraz araştırdıktan sonra for döngüsü içerisinde her eleman için ayrı ayrı manuel destructor çağrısı yapılabileceğini gördüm ancak bunu yaptığımda da runtime error alıyorum. Array'in ilk elemanı siliniyor(cout ile kontrol ettim). İlk elemandan sonrakiler silinemiyor.

Bu durumu nasıl çözebilirim? Ve runtime hatası almamın sebebi nedir?





< Bu mesaj bu kişi tarafından değiştirildi :DHoroHoro:D -- 9 Mart 2012; 17:00:07 >

G
15 yıl (8718 mesaj)
Yarbay

Kodunda mutlaka bir hata vardır. Manuel olarak yok etmeye gerek yok. Ben aşağıdaki kodu denediğimde düzgün çalıştı.

 
#include <iostream>

int x;

class A {
int d;

public:
A() {
d = ++x;
std::cout << d << " oluşturuldu\n";
}

~A() {
std::cout << d << " yok edildi\n";
}
};

class B {
A *ptr;

public:
B(int adet) {
ptr = new A[adet];
}

~B() {
delete [] ptr;
}
};

void dene() {
B b(30);
}

int main()
{
dene();

char c;
std::cin >> c;

return 0;
}


Bu mesaja 1 cevap geldi.
-
15 yıl (3953 mesaj)
Binbaşı

Hata alman normal değil eğer hala sorunu çözmeye çalışıyorsan kodu yazarsan yardımcı olabilirm


Bu mesaja 1 cevap geldi.
B
15 yıl (1220 mesaj)
Yüzbaşı

class destructor, içindeki nesnelerin de destructorlerini çağırır. yani destructor esnasında A'lar zaten siliniyor, sen bir de ekstradan delete ile silmeye çalışıyorsun yani NULL pointer silinemeyeceği için runtime hatası alıyorsun.

http://www.parashift.com/c++-faq-lite/dtors.html


Bu mesaja 1 cevap geldi.
B
15 yıl (1220 mesaj)
Yüzbaşı

ups pardon senin silmeye çalıştığın şey pointermış. classın içinde new ile yarattığın her şeyi delete ile manual silmek zorundasın. kodun hata vermemesi lazım



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.