Bildirim
C++ Destructor çağrısı?
Daha Fazla
Bu Konudaki Kullanıcılar:
Daha Az
1 Misafir - 1 Masaüstü
Giriş
Mesaj
-
-
Edit:
Eklemeyi unutmuşum:
Main metodunun tamamı değil yukarıda yazdığım, aslında o kısım bir if statementın içinde, dolayısıyla Destructor oradan çıkınca çağırılıyor anladığım kadarıyla, ama hata verdiği yerde neden hata veriyor anlamadım. delete'i kullanmayla ilgili bir yanlış yaptım sanırım? (delete[] kullanmam gerekiyordu galiba)
ekleme:
reform metodlarının hepsinini içine de şu şartı ekledim;
if (this->buttons != nullptr)
{
delete[] this->buttons;
}
Örnek bir tane;
void Joystick::reformButtons(const int size)
{
if (this->buttons != nullptr)
{
delete[] this->buttons;
}
this->buttons = new Button[size];
this->buttonCount = 0;
this->buttonSize = size;
}
Bu sefer de "Unhandled exception at 0x549AA9E8 (msvcr120d.dll) in Ground System.exe: 0xC0000005: Access violation reading location 0xCDCDCDC1." hatası alıyorum. Araştırdığıma göre bu adress debug sırasında verilen ve normalde kullanılmayan bir adresmiş.
< Bu mesaj bu kişi tarafından değiştirildi welrocken -- 1 Mayıs 2015; 0:03:35 >
-
Sorunu tam olarak fark edemesek te kopyalamayla ilgili olduğunu düşünüyorum. Fonksiyon imzaların nesnelerin kopyalarını alacak şekilde yazılmış. Fonksiyondan çıkınca kopyanın yıkıcısı çağrılır, bu yüzden sürekli yıkıcı fonksiyon çağrısı görürsün. Kopyalanan nesnenin yıkıcı fonksiyonunda delete varsa program patlar çünkü henüz işi bitmemiş olan bir nesneyi yok eder.
char AddAxis(Potentiometer pot);
Eğer kopya kurucu fonksiyon yazmadıysan bu şekilde parametre c++ ta hatadır. Şu şekilde değiştirmelisin;
char AddAxis(const Potentiometer &pot);
Bir de;
reformButtons(const int size)
Tam tersi buradaki const ta gereksizdir çünkü size kopyalandığı için istesende değiştiremezsin. int gibi basit türlerde const kullanma. class larda ise mümkün olduğunca const ve referans (&) kullan.
Son olarak fonksiyon işaretçisi yerine std::function kullanabilirsin. c++ a daha uygun olur.
typedef void(*buttonmethod) (int buttonId, char buttonState); yerine
std::function<void (int, char)> buttonmethod;
-
quote:
Orijinalden alıntı: elektro_gadget
Sorunu tam olarak fark edemesek te kopyalamayla ilgili olduğunu düşünüyorum. Fonksiyon imzaların nesnelerin kopyalarını alacak şekilde yazılmış. Fonksiyondan çıkınca kopyanın yıkıcısı çağrılır, bu yüzden sürekli yıkıcı fonksiyon çağrısı görürsün. Kopyalanan nesnenin yıkıcı fonksiyonunda delete varsa program patlar çünkü henüz işi bitmemiş olan bir nesneyi yok eder.
char AddAxis(Potentiometer pot);
Eğer kopya kurucu fonksiyon yazmadıysan bu şekilde parametre c++ ta hatadır. Şu şekilde değiştirmelisin;
char AddAxis(const Potentiometer &pot);
Bir de;
reformButtons(const int size)
Tam tersi buradaki const ta gereksizdir çünkü size kopyalandığı için istesende değiştiremezsin. int gibi basit türlerde const kullanma. class larda ise mümkün olduğunca const ve referans (&) kullan.
Son olarak fonksiyon işaretçisi yerine std::function kullanabilirsin. c++ a daha uygun olur.
typedef void(*buttonmethod) (int buttonId, char buttonState); yerine
std::function<void (int, char)> buttonmethod;
Sorun düzeldi, copy constructoru yazdım, add fonksiyonlarında ilk başta referans kullanmıştım, şimdi pointer kullanmayı düşünüyorum olur mu acaba? reform'da const kullanmamın nedeni bi kaç gündür VLA'lerle ilgili falan araştırma yapıyordum sanırım kafam karışmış, new kullanırken girdiğim boyutun constant olmasına gerek yok değil mi? Sonuçta dynamic memory allocation yapıyor? Ben onu hiç düşünmeden yaptım sanki int arr[size] yapar gibi.
Fonksiyon işaretçisi kullanmamın nedeni compiler olarak XC32 kullanacak olmam (veya mikroC 32 compiler) dolayısıyla onlar bahsettiğiniz şeyi içeriyor mu bilmiyorum, açıkçası librarylerini falan açıp okumadım pek, ona baktıktan sonra geçiş yapabilirim std::function'a. Teşekkür ederim cevabınız için, kolay gelsin.
Sayfa:
1
Ip işlemleri
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X