Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 26

 
Andrey Pogoreltsev :

AddValue'da nesnelerin kopyalarını yeni ile yaratırsınız, ancak onları yıkıcıda serbest bırakmazsınız, sadece işaretçiler listesini temizlersiniz.

yardım, bir yıkıcı çağrıldığında, kullanılan sınıfların yıkıcılarının da çağrılacağını söylüyor.

https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures

Komut dosyasını kaldırdıktan sonra terminalin yok edilmeyen nesneler hakkında günlüğe bir uyarı yazmadığı bir durumu hatırlamıyorum - örneğim böyle bir uyarı göstermiyor


Andrey Pogoreltsev :

İkincisi, doğru olana göre, bunu atama operatörü değil, kopya oluşturucu aracılığıyla yapmak gerekiyordu. Ama hepsi bu kadar IMHO)

geliştiricilere göre, MQL'deki basit yapıların veya sınıfların her zaman sorunsuz kopyalandığı bilgisini buldum, birkaç kez kontrol ettim, öyle görünüyor, dil özelliklerini kullanırken


burada, genel olarak, tüm tartışma nedir - MQL C ++ değil, aralarında analoji aramayı uzun zaman önce bıraktım, geliştiriciler bunun böyle uygulandığını yazdı - kontrol ettim, işe yarıyor - yani sen bunu kullanabilir, eğer standart bir C++ sözdizimine sahip olmak kritikse, .dll'deki tüm mantığı çıkarmak zor değil

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
Класс CArrayObj обеспечивает возможность работы с динамическим массивом указателей на экземпляры класса CObject и его наследников. Это дает возможность работы как с многомерными динамическими массивами примитивных типов данных, так и с более сложно организованными структурами данных. В классе реализованы возможности добавления/вставки/удаления...
 
Andrey Pogoreltsev :

AddValue'da nesnelerin kopyalarını yeni ile yaratırsınız, ancak onları yıkıcıda serbest bırakmazsınız, sadece işaretçiler listesini temizlersiniz.

Kahretsin! Ve yıkıcıda new aracılığıyla oluşturulan bir sınıfın örneğini nasıl silebilirsiniz. Dene. Bu işe yaramayacak.

Bunu yalnızca başka bir sınıfın yıkıcısında yapabilirsiniz.

 
Nikolai Semko :

Kahretsin! Ve yıkıcıda new aracılığıyla oluşturulan bir sınıfın örneğini nasıl silebilirsiniz. Dene. Bu işe yaramayacak.

Bunu yalnızca başka bir sınıfın yıkıcısında yapabilirsiniz.

Başka bir sınıfın yıkıcısıyla ilgiliydi. AddValue yönteminde new aracılığıyla oluşturulan öğelerden bahsediyordum

 
Igor Makanu :

yardım, bir yıkıcı çağrıldığında, kullanılan sınıfların yıkıcılarının da çağrılacağını söylüyor.

https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures

Komut dosyasını kaldırdıktan sonra terminalin yok edilmeyen nesneler hakkında günlüğe bir uyarı yazmadığı bir durumu hatırlamıyorum - örneğim böyle bir uyarı göstermiyor


geliştiricilere göre, MQL'deki basit yapıların veya sınıfların her zaman sorunsuz kopyalandığı bilgisini buldum, birkaç kez kontrol ettim, öyle görünüyor, dil özelliklerini kullanırken


burada, genel olarak, tüm tartışma nedir - MQL C ++ değil, aralarında analoji aramayı uzun zaman önce bıraktım, geliştiriciler bunun böyle uygulandığını yazdı - kontrol ettim, işe yarıyor - yani sen bunu kullanabilir, eğer standart bir C++ sözdizimine sahip olmak kritikse, .dll'deki tüm mantığı çıkarmak zor değil

Evet, yardımda gördüm... Çok örtük bir şey, unique_ptr yerine koltuk değneği gibi...

 
Andrey Pogoreltsev :

Evet, yardımda gördüm... Çok örtük bir şey, unique_ptr yerine koltuk değneği gibi...

Ve o kadar rahat ki buna koltuk değneği diyorlar "el kalkmaz":

Herhangi bir sınıftan bir nesne yarattık, onu depolama listesine yerleştirdik ve artık kaldırılmasıyla ilgilenmemiz gerekmiyor - terminal alt sisteminin kendisi her şeyi temizleyecektir.
Ancak aynı zamanda manuel kontrolü ayarlayabilir ve ne zaman, nerede ve hangi ihtiyaç için yaratıldığını ve şimdi gerekli olup olmadığını takip etmek amacıyla yeni oluşturulan tüm nesnelerin ardından "çalıştırabilirsiniz". Gerekli değil - silin. Ama bir hata yaptı - gerekli olduğu ortaya çıktı - geçersiz bir işaretçiye itirazda bulundu ...

Bu yüzden koltuk değneği, işe yaramazlıklarını aramak için "nesnelerin peşinden koşar" ve nesnelerden birini yakalamamış olmanız durumunda bellek sızıntıları konusunda endişelenir.

 
Andrey Pogoreltsev :

İkincisi, doğru olana göre, bunu atama operatörü değil, kopya oluşturucu aracılığıyla yapmak gerekiyordu. Ama hepsi bu kadar IMHO)

doğru kopyalama nasıl yapılır, bu şablona örnek verir misiniz?

 template < typename T> class CDataBase
  {
private :
   CList            *mlist;
   T                *Tptr;
public :
   void CDataBase()           { mlist= new CList;                                       }
   void ~CDataBase( void )      { delete mlist;                                          }
   int ArraySize ( void )        { return (mlist.Total());                                 }
   T * operator []( int index)   { return (mlist.GetNodeAtIndex(index));                   }
   void   AddValue (T &value)  { Tptr = new T; Tptr  = value; mlist.Add(Tptr);          }
   string TypeName()          { return ( typename (T));                                   }
  };

AddValue yöntemini yazmak için yardımı kullandım https://www.mql5.com/ru/docs/basis/types/classes

Kafamı kırdım ama MQL'de örneğimde yazdığımdan başka bir çözüm göremiyorum!

Uygun veri depolama uygulamanızı gösterin

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
 
Artyom Trishkin :

Ve o kadar rahat ki buna koltuk değneği diyorlar "el kalkmaz":

Herhangi bir sınıftan bir nesne yarattık, onu depolama listesine yerleştirdik ve artık kaldırılmasıyla ilgilenmemiz gerekmiyor - terminal alt sisteminin kendisi her şeyi temizleyecektir.
Ancak aynı zamanda manuel kontrolü ayarlayabilir ve ne zaman, nerede ve hangi ihtiyaç için yaratıldığını ve şimdi gerekli olup olmadığını takip etmek amacıyla yeni oluşturulan tüm nesnelerin ardından "çalıştırabilirsiniz". Gerekli değil - silin. Ama bir hata yaptım - gerekli olduğu ortaya çıktı - geçersiz bir işaretçiye eriştiğimde uçtum ...

Bu yüzden koltuk değneği, işe yaramazlıklarını aramak için "nesnelerin peşinden koşar" ve nesnelerden birini yakalamamış olmanız durumunda bellek sızıntıları konusunda endişelenir.

Burada koleksiyona bir pointer ekledikten sonra onun da sizinle kalmasından bahsediyoruz. Bu ilk.

İkincisi, herhangi bir dizi-koleksiyon ve sürekli okuma söz konusu değil, parçalanmış bir sisteminiz var.

Üçüncüsü - hiç kimse işaretçiyi toplama nesnesine ilettiğinizi garanti etmez.
 
Andrey Pogoreltsev :
Burada koleksiyona bir pointer ekledikten sonra onun da sizinle kalmasından bahsediyoruz. Bu ilk.

İkincisi, herhangi bir dizi-koleksiyon ve sürekli okuma söz konusu değil, parçalanmış bir sisteminiz var.

Üçüncüsü - hiç kimse işaretçiyi toplama nesnesine ilettiğinizi garanti etmez.
  1. Bu, yarattığınız tüm nesnelerin terminal alt sistemi tarafından otomatik olarak kaldırılmasını ve bunlara işaret edenlerin listelere yerleştirilmesini koltuk değneği olarak adlandırmanızla ilgiliydi, ancak nesnelerinizin manuel yönetimini ve koltuk değneklerinizi yaratmayı düşünmüyorsunuz. bu bir koltuk değneği
  2. 1. paragraftaki açıklamalarınız ışığında bu söz konusu değildi ve sonuç olarak - size cevabımın ana nedeni
  3. Ve bu konuda ve aynı nedenle.
[Silindi]  
Igor Makanu :

yardım, bir yıkıcı çağrıldığında, kullanılan sınıfların yıkıcılarının da çağrılacağını söylüyor.

https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures

Komut dosyasını kaldırdıktan sonra terminalin yok edilmeyen nesneler hakkında günlüğe bir uyarı yazmadığı bir durumu hatırlamıyorum - örneğim böyle bir uyarı göstermiyor


geliştiricilere göre, MQL'deki basit yapıların veya sınıfların her zaman sorunsuz kopyalandığı bilgisini buldum, birkaç kez kontrol ettim, öyle görünüyor, dil özelliklerini kullanırken


burada, genel olarak, tüm tartışma nedir - MQL C ++ değil, aralarında analoji aramayı uzun zaman önce bıraktım, geliştiriciler bunun böyle uygulandığını yazdı - kontrol ettim, işe yarıyor - yani sen bunu kullanabilir, eğer standart bir C++ sözdizimine sahip olmak kritikse, .dll'deki tüm mantığı çıkarmak zor değil

Bununla üçgen bir dizi yapabilir misin?

[Silindi]  

Dilin sınırlamaları nedeniyle, iyi bir şeyin ortaya çıkması pek olası değildir. Böyle bir koltuk değneğine sahibim (standart bir dizi üzerinde hafif bir sargı)

 #define GENERATE_VECTOR_GROWTH_FACTOR 2
#define GENERATE_VECTOR(NAME, REF)                                         \  
   template < typename T>                                                   \
   class NAME                                                              \
   {                                                                       \
       int sz;                                                              \
       bool fail_state;                                                     \
   public :                                                                 \
      T a[];                                                               \
      NAME(): sz( 0 ), fail_state( false ) {}                                  \
       bool operator !() const       { return this .fail_state;}                 \
       uint size() const            { return this .sz;}                         \
       void clear()               { this .sz = 0 ; this .fail_state = false ;}   \
       void push_back(T REF value) {                                        \
         if ( this .sz == ArraySize ( this .a)  &&                              \
             ArrayResize ( this .a, this .sz*                                  \
                           GENERATE_VECTOR_GROWTH_FACTOR+ 1 ) == - 1 ) {       \
             this .fail_state = true ;                                        \
             return ;                                                        \
         }                                                                 \
         this .a[ this .sz++] = value;                                        \
      }                                                                    \
       void reserve( int new_cap) {                                          \
         if (new_cap > ArraySize ( this .a))                                  \
             ArrayResize ( this .a, new_cap);                                  \
      }                                                                    \
       void erase( int pos) {                                                \
         if ( ! ArrayRemove ( this .a, pos, 1 ) )                              \
             this .fail_state = true ;                                        \
      }                                                                    \
   };
#define GENERATE_VECTOR_EMPTY
GENERATE_VECTOR(vector_fund, GENERATE_VECTOR_EMPTY);   // для фундаментальных типов
GENERATE_VECTOR(vector_ref, const &);                 // для пользовательских
#undef GENERATE_VECTOR_EMPTY
#undef GENERATE_VECTOR_GROWTH_FACTOR

struct S { int a;};
class Q {};
bool f() {
   vector_ref<S> v1;
   vector_fund< int > v2;
   vector_ref<Q> v3;
   
   Q q;
   v3.push_back(q);
   v2.push_back( 3 );
   v2.a[ 0 ] = 5 ;
   
   return !(!v1 || !v2 || !v3);
}

İşaretçileri depolamak için bir unique_ntr sarmalayıcı yazın (tam teşekküllü bir paket çalışmayacak olsa da, en azından auto_ntr). Benim düşünceme göre, böyle bir ilkel bile std'den şablon analoglarından çok daha uygundur.