Çaydanlıktan gelen sorular - sayfa 107

 
mql5 :
MQL5'teki yıkıcılar her zaman sanaldır. Her şey doğru şekilde silindi, Print'i (__ FUNCSIG __) indirmeyi deneyin; yıkıcılarda.


VC++'da yaptım, ancak bellek serbest bırakma mekanizmalarının aynı olduğunu düşünüyorum?
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
220Volt :
VC++'da yaptım, ancak bellek serbest bırakma mekanizmalarının aynı olduğunu düşünüyorum?
Hayır, C++'da bir nesneyi silme yoluyla düzgün bir şekilde silmek için sanal bir yıkıcı belirtmelisiniz.

Ancak örneğiniz doğru çalışacaktır, çünkü. yalnızca temel sınıfın sanal yıkıcısını belirtebilirsiniz.
 

Fikri biraz farklı ifade etmeye çalışacağım:

Verilen:

  • Sınıf No. 1 - bellekte 100 bayt yer kaplar.
  • Sınıf No. 2 - 1 numaralı sınıfın halefidir, bellekte 200 bayt yer kaplar.
  • 1. sınıfa işaretçi.

Hareketler:

  • İşaretçiye, sınıf No. 2 örneğinin bulunduğu bellek alanının adresini yazıyoruz (yeni olarak adlandırılır)
  • İşaretçide kayıtlı adresi silme işlevine geçirerek lehim alanını serbest bırakıyoruz.

Not: resim bellek modelini gösterir)

 
Şüpheler, çünkü bir numaralı sınıfa işaretçi, ama aslında iki numaralı bellek sınıfında. Gerçekten de, yıkıcıların olduğu durumlarda, bu önemli, bu yüzden düşündüm ve aniden burada bir sorun olabilir. Böyle bir durumda, belleğin doğru serbest bırakılmasının ancak bellekte bazı işaretler (boş sonlandırıcılı char gibi) veya buna benzer bir şey varsa gerçekleşebileceğini düşünüyorum, bu yüzden belleğin nasıl tahsis edildiğini sordum.
 
220Volt :
Şüpheler, çünkü bir numaralı sınıfa işaretçi, ama aslında iki numaralı bellek sınıfında. Gerçekten de, yıkıcıların olduğu durumlarda, bu önemli, bu yüzden düşündüm ve aniden burada bir sorun olabilir. Böyle bir durumda, belleğin doğru serbest bırakılmasının ancak bellekte bazı işaretler (boş sonlandırıcılı char gibi) veya buna benzer bir şey varsa gerçekleşebileceğini düşünüyorum, bu yüzden belleğin nasıl tahsis edildiğini sordum.

Şüpheniz, kurucuları kaydetmemiş olmanızdan kaynaklanmaktadır (bu durumda ne olduğunu anlamak için bu önemlidir), bu örneği çalıştırmayı deneyin ve her şeyi anlayacaksınız:

 class CFoo
  {
public :
                     CFoo() { Print ( __FUNCSIG__ ); }
                    ~CFoo() { Print ( __FUNCSIG__ ); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CBar : public CFoo
  {
public :
                     CBar() { Print ( __FUNCSIG__ ); }
                    ~CBar() { Print ( __FUNCSIG__ ); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   CFoo *f= new CBar();

   delete f;
  }
//+------------------------------------------------------------------+

Tehdit oluşturmanın kendisi, silme gibi, adım adım gerçekleşir ve tüm bu bilgiler saklanır (sanal işaretçinin kendisi, sınıfın tabandan ve alt öğeden bir bileşik olarak oluşturulduğunu unutmayın) ve silme sırasında yıkıcılar tersine çağrılır. sipariş, daha sonradan önceye.

 
Yıkıcılarla ilgili değil, ana şey değiller, sınıfın kendisiyle veya daha doğrusu kaç bayt aldığıyla ilgili. 200 bayt ayırdığımız ortaya çıktı ve sonra 100 baytlık bir nesneyi temsil eden işaretçi tarafından işaret edilen belleği boşaltmamı söylüyoruz.
 
220Volt :
Yıkıcılarla ilgili değil, ana şey değiller, sınıfın kendisiyle veya daha doğrusu kaç bayt aldığıyla ilgili. 200 bayt ayırdığımız ortaya çıktı ve sonra 100 baytlık bir nesneyi temsil eden işaretçi tarafından işaret edilen belleği boşaltmamı söylüyoruz.
Anladığım kadarıyla sorunuz hafıza havuzunun özellikleri ile ilgili.
Evet, hafıza havuzu, silme çağrısı ile parçanın ne kadar süreyle serbest bırakılacağını bilir.
Bu bilgilerin depolandığı yer, havuzun uygulanmasına bağlıdır.

Örneğin, C++'da new aracılığıyla tahsis edilmemiş bir nesneye işaretçi verirseniz, uygulamanızın nasıl çökeceğini göreceksiniz.
 
220Volt :
Yıkıcılarla ilgili değil, ana şey değiller, sınıfın kendisiyle veya daha doğrusu kaç bayt aldığıyla ilgili. 200 bayt ayırdığımız ortaya çıktı ve sonra 100 baytlık bir nesneyi temsil eden işaretçi tarafından işaret edilen belleği boşaltmamı söylüyoruz.
Örneğimi başlatmadığınızı çok iyi anladım. Yoksa böyle sorular olmazdı.
 
Örneğin, bir dizi int için bellek ayırmanın ve ardından bir int'nin küçük olmasına rağmen, muhtemelen sınıflarla da her şeyi silmenin mümkün olduğunu hatırladım. Cevaplar için teşekkürler.
 
mql5 :
Anladığım kadarıyla sorunuz hafıza havuzunun özellikleri ile ilgili.
Evet, hafıza havuzu, silme çağrısı ile parçanın ne kadar süreyle serbest bırakılacağını bilir.
Bu bilgilerin depolandığı yer, havuzun uygulanmasına bağlıdır.

Örneğin, C++'da new aracılığıyla tahsis edilmemiş bir nesneye işaretçi verirseniz, uygulamanızın nasıl çökeceğini göreceksiniz.
Bu kadar, teşekkürler.