MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 598

 
Juer :

Söyleyin bana, burada bir CArrayObj nesnesi yaratıyorum, ona başka nesneler ekliyorum. Hala nesnelerin kendilerine ihtiyacım var. Ve bu liste nesnesini silebilirim.

Silmeden önce nesneleri kaldırmak için hangi yöntemi kullanmalıyım? Ayır() veya Sil() ?

Veya Temizle() / Kapatma()?

Belleğin nasıl tahsis edildiğini ve onunla nasıl çalışılacağını anlamadığınız için kafanız karıştı. Genel durumda, ne CArrayObj ne de içinde bulunan nesnelerin manuel olarak silinmesine gerek yoktur .

 // Где-то в коде есть объект CArrayObj
CArrayObj ArrayOfItems;
...
//Где-то в коде заполнили коллекцию пользовательскими объектами
void Create()
{
  ArrayOfItems.Add( new CUserItem());
  ArrayOfItems.Add( new CUserItem());
   //...
  ArrayOfItems.Add( new CUserItem());
}
// Так не правильно делать. Удалять ничего не надо.
void OnDeinit ( const int reason)
{
   delete ArrayOfItems;
}
 

Sınıf işlevine bir nesne, ona bir başvuru iletirim, böylece işlevdeki eylemler onunla birlikte gerçekleşir ve sonra geri döner. Ve artık sınıf nesnesinin kendisine ihtiyacım yok... Onu nasıl silebilirim?

 for ( int i= 0 ;i<test_objects.Total();i++)
  {
   bool res= false ;
   CTestObject *test_object=test_objects.At(i);
   if (! CheckPointer (test_object)
         continue ;
   CTestClass *test_class= new CTestClass();
   if (test_class.Check(test_object))
        res= true ;
   delete test_class;
  }

Aşağı yukarı böyle. Burada test_class'ı siliyorum, bir sonraki yinelemede Geçersiz işaretçi alıyorum...

Kendisine iletilen nesneyi silmeden test_class'ı nasıl silebilirim?

 
Vasiliy Sokolov :

Belleğin nasıl tahsis edildiğini ve onunla nasıl çalışılacağını anlamadığınız için kafanız karıştı. Genel durumda, ne CArrayObj ne de içinde bulunan nesnelerin manuel olarak silinmesine gerek yoktur .

Peki bir dizi nesne oluşturduysam. Yani ArrayObj dizi nesnesi, onunla gerekli işlemleri yaptı. O zaman bu nesneye ihtiyacım yok, ancak içindeki nesnelere (dizi üyeleri) ihtiyaç var, bu dizi nesnesini silmeli miyim?

 

Bu UV Ihor Herasko haftasonuna kadar sürecek, ancak hafta sonu müsait değil; )

sorular geçen perşembeden beri askıda! :)

İncelemelerimden hala sorumluyum ve size iyi bir inceleme yaptım, kibar olun, oyununuzu bir la “Günde 1 soru cevaplıyorum” diye bitirin, çünkü beklentiden memnun değilim ve çok da değilim. İnceleme isteğimi düzeltmekte iyi. bu gidişle önümüzdeki haftanın tamamını beklemem gerekecek ve baykuşu revizyon için serbest çalışan birine vermem gerekecek; )
 
Juer :

Sınıf işlevine bir nesne, ona bir başvuru iletirim, böylece işlevdeki eylemler onunla birlikte gerçekleşir ve sonra geri döner. Ve artık sınıf nesnesinin kendisine ihtiyacım yok... Onu nasıl silebilirim?

Aşağı yukarı böyle. Burada test_class'ı siliyorum, bir sonraki yinelemede Geçersiz işaretçi alıyorum...

Kendisine iletilen nesneyi silmeden test_class'ı nasıl silebilirim?

Nesnelere işaretçiler oluşturmaktan kaçınmalısınız. Bunun yerine, doğrudan işlevin yığınındaki nesneler üzerinde işlem yapın:

CTestClass test_class;
for ( int i= 0 ;i<test_objects.Total();i++)
  {
   bool res= false ;
   CTestObject *test_object= dynamic_cast <CTestObject*>(test_objects.At(i));
   if (test_object == NULL )
         continue ;
   if (test_class.Check(test_object))
        res= true ;
  }

Çünkü test_object'in CTestObject nesneleri içermesi garanti edilir (bu nesnelerden başka bir şey eklemediniz, değil mi? :) O zaman, yayın denetimi kaldırılarak kod daha da basitleştirilebilir:

CTestClass test_class;
for ( int i= 0 ;i<test_objects.Total();i++)
  {
   CTestObject *test_object = test_objects.At(i);
   bool res = test_class.Check(test_object);   
  }

Peki, çok kısaca:

CTestClass test_class;
for ( int i= 0 ;i<test_objects.Total();i++)
   bool res = test_class.Check((CTestObject)test_objects.At(i));
 
Juer :

Peki bir dizi nesne oluşturduysam. Yani ArrayObj dizi nesnesi onunla gerekli işlemleri yaptı. O zaman bu nesneye ihtiyacım yok, ancak içindeki nesnelere (dizi üyeleri) ihtiyaç var, bu dizi nesnesini silmeli miyim?

CArrayObj'ın amacını anlamıyorsunuz. Bu, içine yerleştirdiğiniz nesnelerin sahibidir. CArrayObj'yi silin, içine yerleştirdiğiniz nesneler de silinecektir. ArrayObj bu nesnelerin sahibi olduğundan, aynı zamanda onların yöneticisidir - nesne referanslarını kontrol eder ve koleksiyona artık ihtiyaç duyulmadığı durumlarda tahsis edilen tüm belleği otomatik olarak siler. Yani hiçbir şeyi serbest bırakmanıza ve silme operatörünü kullanmanıza gerek yok. Her şey CArrayObj'nin kendisi tarafından yapılır. CArrayObj'nin kendisi pratik olarak bilgisayarda bellekte yer kaplamaz (birkaç on bayt) ve bu nedenle onu silmeye çalışmak anlamsızdır.

 
Vasiliy Sokolov :

CArrayObj'ın amacını anlamıyorsunuz. Bu, içine yerleştirdiğiniz nesnelerin sahibidir. CArrayObj'yi silin, içine yerleştirdiğiniz nesneler de silinecektir. ArrayObj bu nesnelerin sahibi olduğundan, aynı zamanda onların yöneticisidir - nesne referanslarını kontrol eder ve koleksiyona artık ihtiyaç duyulmadığı durumlarda tahsis edilen tüm belleği otomatik olarak siler. Yani hiçbir şeyi serbest bırakmanıza ve silme operatörünü kullanmanıza gerek yok. Her şey CArrayObj'nin kendisi tarafından yapılır. CArrayObj'nin kendisi pratik olarak bilgisayarda bellekte yer kaplamaz (birkaç on bayt) ve bu nedenle onu silmeye çalışmak anlamsızdır.

Ancak, daha sonra silinmemiş nesneler CArrayObj hataları

 
Juer :

Ancak, daha sonra silinmemiş nesneler CArrayObj hataları

Böylece CArrayObj ile işleri batırdılar. Bunun yerine: CArrayObj test_objects; Yazdılar: CArrayObj* test_objects , ancak bunun için bir yıkıcı yapmayı unuttular ; Belki de bellek modeli, CArrayObj ile çalışacak şekilde yanlış yapılandırılmıştır. Belki sadece işaretçiler ile abarttılar. Teşhis kesindir: gerekli olmayan işaretçilerin kullanılması genellikle sızıntılara yol açar.

 

Merhaba!

Lütfen bana imleci nasıl hareket ettireceğimi söyleyin, örneğin bir metin belgesinde 7. satıra, bu konumdan zaten bir alt dize çıkarmak için ...

Hangisi daha hızlı olacak - tek satırlı birçok metin dosyası mı yoksa çok satırlı bir dosya mı?

 
Vasiliy Sokolov :

Böylece CArrayObj ile işleri batırdılar. Bunun yerine: CArrayObj test_objects; Yazdılar: CArrayObj* test_objects , ancak bunun için bir yıkıcı yapmayı unuttular ; Belki de bellek modeli, CArrayObj ile çalışacak şekilde yanlış yapılandırılmıştır. Belki de sadece işaretçileri karıştırdılar. Teşhis kesindir: gerekli olmayanişaretçilerin kullanılması genellikle sızıntılara yol açar.

Onlara nerede ihtiyaç var? Sadece nesneleri ilan edebildiğinizde bunları kullanmanın amacı nedir?