MQL5'te OOP hakkında sorular - sayfa 4

 
Dmitry Fedoseev :
Ayrıca bir işaretçiyi referans olarak değil - & olmadan iletebilirsiniz.
Yapabilir. Yalnızca bir işaretçiyi & olmadan iletirseniz, yığında geçen değere atanan yeni bir işaretçi oluşturulur. Aynı zamanda fonksiyonda bu pointer'a göre bellek ayırırsak stack üzerinde oluşturulan pointer sırasıyla değişir, stack "açıldığında" ise memory sızıntısı alırız. Tabii ki bunu yapmak iyi değil, ama bir kişi isterse ...
 
Vladimir Simakov :
daha sonra işaretçi tam olarak yığında oluşturulanı değiştirir, yığın "açıldığında", bir bellek sızıntısı alırız. Tabii ki bunu yapmak iyi değil, ama bir kişi isterse ...

işaretçilerin MQL'deki sınıflara davranışı tahmin edilemez, yöneticilerden biri bir keresinde tüm sınıfların global bellekte (bellek tahsisi) oluşturulduğunu yazdı, yerel görünürlükteki sınıflara işaretçilerin yığında oluşturulduğunu yazıyorsunuz (IMHO, bu nasıl olmalı!)

Belki bir şeyi karıştırıyor olsam da, belki kontrol edeceğim - teorik olarak kontrol etmek zor değil, test sınıfının yıkıcısına Print() yazmak yeterli, yıkıcılar yerel kapsamdan çıkarken otomatik olarak çağrılmalıdır. ..

 
Vladimir Simakov :
Yapabilir. Yalnızca bir işaretçiyi & olmadan iletirseniz, yığında geçen değere atanan yeni bir işaretçi oluşturulur. Aynı zamanda fonksiyonda bu pointer'a göre bellek ayırırsak stack üzerinde oluşturulan pointer sırasıyla değişir, stack "açıldığında" ise memory sızıntısı alırız. Tabii ki bunu yapmak iyi değil, ama bir kişi isterse ...

Sızıntı olmayacak. Çünkü fonksiyonda kimse o işaretçi için bir şey ayırmaz.

 
Igor Makanu :

işaretçilerin MQL'deki sınıflara davranışı tahmin edilemez, yöneticilerden biri bir keresinde tüm sınıfların global bellekte (bellek tahsisi) oluşturulduğunu yazdı, yerel görünürlükteki sınıflara işaretçilerin yığında oluşturulduğunu yazıyorsunuz (IMHO, bu nasıl olmalı!)

Belki bir şeyi karıştırıyor olsam da, belki kontrol edeceğim - teorik olarak kontrol etmek zor değil, test sınıfının yıkıcısına Print () yazmanız yeterli, yıkıcılar yerel kapsamdan çıkarken otomatik olarak çağrılmalıdır.. .

Bellek dinamik olarak (yeni) tahsis edilirse, öbek üzerinde tahsis edilir ve yığın üzerinde bir nesne (CObj obj;) oluşturursanız, bellek de yığın üzerinde ona tahsis edilir.

 
Dmitry Fedoseev :

Sızıntı olmayacak. Çünkü fonksiyonda kimse o işaretçi için bir şey ayırmaz.

 void CreateLabel(CChartObjectLabel *l, string name, int y)
  {
   l= new CChartObjectLabel;
   l.Create( 0 ,name, ChartWindowFind (), 0 ,y);
   l.Color( clrYellow );
   l.FontSize( 14 );
   l.Description(name);
  }

Klasik sızıntı. Yığın üzerinde oluşturulan ve işleve iletilen değerle oluşturma sırasında başlatılan bir işaretçiye yeni bir değer atanır ve yeni bir nesneye işaretçi olur. Bundan sonra, yığın çözme sırasında işaretçi güvenli bir şekilde öldürüldü. Q.E.D. Bu tam olarak olması gereken yer:

 void CreateLabel(CChartObjectLabel* &l, string name, int y)
 
Vladimir Simakov :

Bellek dinamik olarak (yeni) tahsis edilirse, öbek üzerinde tahsis edilir ve yığın üzerinde bir nesne (CObj obj;) oluşturursanız, bellek de yığın üzerinde ona tahsis edilir.

mql - (CObj obj;)'de böyle bir şey yoktur.

 
Vladimir Simakov :

Klasik sızıntı. Yığın üzerinde oluşturulan ve işleve iletilen değerle oluşturma sırasında başlatılan bir işaretçiye yeni bir değer atanır ve yeni bir nesneye işaretçi olur. Bundan sonra, yığın çözme sırasında işaretçi güvenli bir şekilde öldürüldü. Q.E.D. Bu tam olarak olması gereken yer:

Tanrı'nın armağanını omletle karıştırmayın. Üstelik hatalı bir ifadeyi onaylamak için aptalca kod yazmak...

 
Dmitry Fedoseev :

mql'de böyle bir şey yok - (CObj obj;)

Haydi! Her zaman kullandığım şey bu.
 
Vladimir Simakov :
 void CreateLabel(CChartObjectLabel *l , string name, int y)
  {
   l= new CChartObjectLabel ;
   l.Create( 0 ,name, ChartWindowFind (), 0 ,y);
   l.Color( clrYellow );
   l.FontSize( 14 );
   l.Description(name);
  }

Klasik sızıntı. Yığın üzerinde oluşturulan ve işleve iletilen değerle oluşturma sırasında başlatılan bir işaretçiye yeni bir değer atanır ve yeni bir nesneye işaretçi olur. Bundan sonra, yığın çözme sırasında işaretçi güvenli bir şekilde öldürüldü. Q.E.D. Bu tam olarak olması gereken yer:

Ve neden işleve iletilen işaretçiyi bilerek yeniden atadınız? Elbette bir sızıntı olacak. Ancak bu "klasik bir sızıntı" değil, bir nesneye işaretçi ile çalışmanın klasik bir hatasıdır.

Burada yeni bir nesne oluşturmanız gerekmez, ancak işleve geçirilen işaretçi olan harici bir nesne ile çalışmanız gerekir.

 
Vladimir Simakov :
Haydi! Her zaman kullandığım şey bu.

Neresi? Nerede ve nasıl?

Neden: