Çaydanlıktan gelen sorular - sayfa 106

 
uncleVic :
Sorun... Lütfen bir sinyal modülü takın (Bende yok). Bakalım.
Dosyalar:
 
openlive :

Daha da garip. etkisini anlamıyorum.
 
uncleVic :

Daha da garip. etkisini anlamıyorum.

etki yalnızca başlatma sırasında, test cihazında her şey yolunda

tamam, seçmeye gerek yok, gerçekten ihtiyacım yok

 

ZigZag göstergesinden artık orada olmayan değerleri okur (muhtemelen yeniden çizmeden önceydiler) Bu önlenebilir mi?

Tamponda değerler varsa neden tekrar çekmiyor...

 

Merhaba, lütfen aşağıdakileri açıklayın:

 class Cbase
{
public :
         virtual ~Cbase(){};
         int k;
};

class Cchild: public Cbase
{
public :
        ~Cchild(){};
         double *p;
         int f;
};

İki sınıfım var, bir sonraki neslin örneğinin ( base - child - child2 - ...) bellekte daha fazla yer kapladığına inanıyorum. New operatörüne parametrelerde sınıfı ileterek tam olarak ne kadar bellek ayrılacağını söylüyoruz. Ancak silme operatöründe ne kadar silineceği konusunda bir şey söylemiyoruz. Bu yansımalara dayanarak, aşağıdaki durumda ne olacağı tam olarak belli değil:

 void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return ;
}

Onlar. Yani, *pClass'ı Cbase'e işaretçi olarak ilan ettik (Cchild'e kıyasla küçük bir sınıf), ama aslında Cchild'e işaret ediyor. Buradan soru, delete () nasıl davranacak? Cbase boyutuna eşit bayt sayısını serbest bırakacak mı (o zaman bellek tıkanacak) yoksa silme doğru bir şekilde mi olacak?

Not: peki, konuyla ilgili bir soru için: ayrılmış bellek alanında (yeni) bu alanın boyutunu anlayabileceğiniz bir tür etiket var mı (bir karakterin boş bir sonlandırıcı ile nasıl depolandığı gibi bir şey). son)? Veya başka bir deyişle, doğru bir şekilde beyan ettiğim sınıfların boyutları hakkında hiçbir şey bilmeyen bir kod parçası hafızayı boşaltabilir mi?

 

220Volt :

Buradan soru, delete () nasıl davranacak? Cbase boyutuna eşit bayt sayısını serbest bırakacak mı (o zaman bellek tıkanacak) yoksa silme doğru bir şekilde mi olacak?

elbette doğru şekilde kaldıracaktır. yıkıcılara kesme noktaları dağıtabilirsiniz

Not: peki, konuyla ilgili bir soru için: ayrılmış bellek alanında (yeni) bu alanın boyutunu anlayabileceğiniz bir tür etiket var mı (bir karakterin boş bir sonlandırıcı ile nasıl depolandığı gibi bir şey). son)? Veya başka bir deyişle, doğru bir şekilde beyan ettiğim sınıfların boyutları hakkında hiçbir şey bilmeyen bir kod parçası hafızayı boşaltabilir mi?

boyutu?
 
sergeev :

tabii ki doğru bir şekilde silinecektir. yıkıcılara kesme noktaları dağıtabilirsiniz

Bu sorunun oradan büyüyen bacakları var. Yaklaşık olarak anlatıldığı gibi yaptım (yıkıcı sanal değildi) ve işaretçi sınıfının altındaki yıkıcılar çağrılmadı.
 
sergeev :
boyutu?
Bence sizeof derleme zamanında çalışır ve örneğin başka bir süreçten belleği boşaltmaktan bahsediyorum. Eğer bu mümkünse, o zaman silme fonksiyonunun işinin netleşeceğini düşünüyorum.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по 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.

 class CFoo
  {
public :
   ~CFoo() { Print ( __FUNCSIG__ ); }
  };

class CBar : public CFoo
  {
public :
   ~CBar() { Print ( __FUNCSIG__ ); }
  };

void OnStart ()
  {
   CFoo *f= new CBar();
   
   delete f;   
  }
 
Soru, yeni aracılığıyla sınıf işlevlerine ne tahsis ettiğimizle ilgili değil, sınıfın verileriyle, onun "kök" üyeleriyle ilgilidir. Sonuçta, onlar da boş alan değil.