Эта небольшая статья в первую очередь предназначена для начинающих C++ программистов, которые либо слышали об умных указателях, но боялись их применять, либо они устали следить за new-delete. UPD: Статья писалась, когда C++11 еще не был так популярен. Итак, программисты С++ знают, что память нужно освобождать. Желательно всегда. И они знают...
Muhtemelen, kendinizi bunun gibi bir şeyle sınırlandırmalısınız (hiç kopyalayamazsınız):
template < typename T_>
class unique_ptr{
T_ *p;
public :
unique_ptr( void *ptr= NULL ): p(ptr) {}
~unique_ptr() {reset();}
unique_ptr * operator =(T_ *p_) {reset(); p = p_; return & this ;}
// releases ownership of the managed object
T_ *release() {T_ *r = p; p = NULL ; return r;}
// destroys the managed object void reset() { if (p) delete p; p= NULL ;}
// returns a pointer to the managed object
T_ *get() { return p;}
unique_ptr( const unique_ptr<T_> &other);
voidoperator =( const unique_ptr<T_> &other);
void swap(unique_ptr<T_> &other){
T_ *buf = p;
p = other.p;
other.p = buf;
}
};
auto_ptr için neden bir kopya oluşturdum? µl - öğesinin eğriliği nedeniyle, bir yığın nesnesini CArrayObj öğesine kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir. Ama buna değer olduğunu düşünmüyorum. Bu bağlamda, ilk mesajı yıkacağım.
auto_ptr için neden bir kopya oluşturdum? µl'nin eğriliği nedeniyle - bir yığın nesnesini CArrayObj'e kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir.
Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
class Q : public CObject {
public :
Q() {}
Q( int i) {}
};
voidOnStart ()
{
CArrayObj ar;
Q q( 3 );
Q *new_el = new Q;
new_el = q;
ar.Add(new_el);
Q new_el2( 5 );
q = new_el2;
}
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda olur, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.
Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:
Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...
Burada herhangi bir sorun görmüyorum.
Ben, sertleşmiş yaşlı bir osuruk olarak - hafızanın otomatik olarak silindiği C # yaklaşımını sevmiyorum. Benim için, onları isteyen kişi, oradaki bazı "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.
Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.
Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:
Nasıl aynı? Otomatik olarak bir kopya oluşturucu vardır ve tüm işlemler şöyle görünür:
class Q : public CObject {
public :
Q( int i) {}
};
voidOnStart ()
{
CArrayObj ar;
Q q( 3 );
ar.Add( new (q));
q = Q( 5 );
}
Evet ve sizin durumunuzda bir kopya oluşturucu ayarlamak ve bir satıra öğeler eklemek daha kolaydır.
Doğal olarak, bu bir örnek için bir oyuncak sınıfıdır, gerçekte bazı verilerdir, belki de çoktur, bir kopya oluşturucu yazmak hiç bir seçenek değildir. Gerekli yerleri sarmalayıcılara sardık ve özel bir kurucuya gerek kalmadı.
Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...
Burada herhangi bir sorun görmüyorum.
Ben, sertleşmiş yaşlı bir osuruk olarak - sadece belleğin otomatik olarak silindiği C # yaklaşımını sevmiyorum. Bana göre, onları talep eden kişi, oradaki "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.
Mikrolitrelerde akıllı işaretçiler olmadan yapabilirsiniz. Çöp toplayıcı != akıllı işaretçiler, en azından istisnalar nedeniyle onlarsız yapamazsınız. Çöp toplayıcıyı da sevmiyorum.
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Hatalar, hatalar, sorular
fxsaber , 2018.12.01 11:15
Süper fren tasarımı1 milyon satırlık 40 MB'lık bir dosya 18 saniyede okunur.
Aynı çıktı, ancak farklı şekilde yapıldı
0,5 saniyede tamamlanır.
auto_ptr'nin basit analogu (kullanımdan kaldırıldı). Not: oldukça benzer değil,
...
https://habr.com/post/140222/
pavlick_
Operatör= içinde, başına bir satır eklemeniz gerekir:
Muhtemelen, kendinizi bunun gibi bir şeyle sınırlandırmalısınız (hiç kopyalayamazsınız):
auto_ptr için neden bir kopya oluşturdum? µl - öğesinin eğriliği nedeniyle, bir yığın nesnesini CArrayObj öğesine kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir. Ama buna değer olduğunu düşünmüyorum. Bu bağlamda, ilk mesajı yıkacağım.auto_ptr için neden bir kopya oluşturdum? µl'nin eğriliği nedeniyle - bir yığın nesnesini CArrayObj'e kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir.
Ve neden "eğrilik mkl"?
Ve neden "eğrilik mkl"?
Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda olur, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.
Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:
ar.Add( new Q(q));Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:
Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.
Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...
Burada herhangi bir sorun görmüyorum.
Ben, sertleşmiş yaşlı bir osuruk olarak - hafızanın otomatik olarak silindiği C # yaklaşımını sevmiyorum. Benim için, onları isteyen kişi, oradaki bazı "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.
Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.
Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:
Nasıl aynı? Otomatik olarak bir kopya oluşturucu vardır ve tüm işlemler şöyle görünür:
Evet ve sizin durumunuzda bir kopya oluşturucu ayarlamak ve bir satıra öğeler eklemek daha kolaydır.
Doğal olarak, bu bir örnek için bir oyuncak sınıfıdır, gerçekte bazı verilerdir, belki de çoktur, bir kopya oluşturucu yazmak hiç bir seçenek değildir. Gerekli yerleri sarmalayıcılara sardık ve özel bir kurucuya gerek kalmadı.
Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...
Burada herhangi bir sorun görmüyorum.
Ben, sertleşmiş yaşlı bir osuruk olarak - sadece belleğin otomatik olarak silindiği C # yaklaşımını sevmiyorum. Bana göre, onları talep eden kişi, oradaki "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.
Mikrolitrelerde akıllı işaretçiler olmadan yapabilirsiniz. Çöp toplayıcı != akıllı işaretçiler, en azından istisnalar nedeniyle onlarsız yapamazsınız. Çöp toplayıcıyı da sevmiyorum.