MQL5 Derleyici, bir sınıf ile ona yönelik bir işaretçi arasında ayrım yapmaz - sayfa 2

 
SemenTalonov :

Bir kopya için beklediğim buydu.Varsayılan kopya oluşturucu bir hata değil.

Ancak Dmitry , bellekte yeni bir nesnenin ayrılacağını ve POINTER_AUTOMATIC türünde bir işaretçinin döndürüleceğini ve kopya olmayacağını iddia ediyor.

Herkes MQL'nin tuhaflıklarını kendi tarzında anlar)

Evet. Noel Baba yok.

Bellekteki herhangi bir nesne hakkında yazmadım.

Tamam, bir zamanlar anlaşmazlıklar vardı - bir bağlantı bir işaretçiden nasıl ayırt edilir. Ama şimdi, nesne işaretçiden ayırt edilemiyor gibi görünüyor.

 
Dmitry Fedoseev :

Nesnenin kopyası nereden gelecek? İşaretçinin bir kopyası - evet, ancak aynı nesneye işaret ediyor.

Bir dizi nesnemiz var. Bu dizinin ilk elemanında, kendisine ayrı olarak oluşturulmuş bir nesnenin iletildiği atama operatörü çağrılır (operatör bildirilmemesine rağmen). Sizce bundan sonra bu dizinin ilk elemanında ne olmalı? Bence nesne kalmalı.

 
SemenTalonov :

Bunu ayrıca, açıkça bildirilmiş bir kopya oluşturucunun bu testte hiçbir şeyi değiştirmeyeceğini yazdım.

Apaçık olanı nasıl görmezsin.

bir nesne dizisinin bir öğesine bir işaretçi yerleştirilir ve bir işaretçi dizisinin bir öğesine bir nesne yerleştirilir.. bu gerçekten normal mi?

ilk durumda, nesnenin işaretçisi diziye gider; ikinci durumda, kopya oluşturucu çalışmalıdır, bu işlemler nasıl eşdeğer olabilir?

Bir kopya oluşturucu değil, bir atama operatörü, ancak bunlar önemsiz şeyler.

Nesne dizisinin bir öğesi "işaretçi" içermez. Bir nesne dizisinin bir elemanı tam olarak bir nesne içermelidir.

İlk durumda - tam olarak bir dizi nesneniz var, ne tür "işaretçiler"?

 
Georgiy Merts :

Bir dizi nesnemiz var. Bu dizinin ilk elemanında, kendisine ayrı olarak oluşturulmuş bir nesnenin iletildiği atama operatörü çağrılır. Sizce bundan sonra bu dizinin ilk elemanında ne olmalı? Bence nesne kalmalı.

Ve ... genel olarak orada her şey kötü))) Bir dizi otomatik işaretçi ve dinamik olarak oluşturulan bir nesne de buna itilir. Sonra 3 nesne, ikisi otomatik olarak silinecek ve biri sızdırılacak. Derlenirse.

 

Bunun gibi olmalı:

A* m_A[ 2 ];

böyle:

m_A[ 0 ] =GetPointer(a); 
 

Ve sonunda şöyle:

 for ( int i= 0 ;i< 2 ;i++) if ( CheckPointer (m_A[i])==POINTER_DINAMIC) delete (m_A[i]); 
 
Dmitry Fedoseev :

Ve ... genel olarak orada her şey kötü))) Bir dizi otomatik işaretçi ve dinamik olarak oluşturulan bir nesne de buna itilir.

En sonunda!))

George Merts'in fotoğrafı.

Nesne dizisinin bir öğesi tam olarak nesneyi içermelidir .

İlk durumda - tam olarak bir dizi nesneniz var, ne tür "işaretçiler"?

İşte bundan bahsediyorum! Neden ÇALIŞIYOR?

m_A[ 1 ] = new A();
 
SemenTalonov :

En sonunda!))

İşte bundan bahsediyorum! Neden ÇALIŞIYOR?

A şöyle bildirilirse:

A* m_A[ 2 ]; 

Tamam.

Ve öyle olsa bile:

A m_A[ 2 ]; 

O zaman derleme yapmamalı. Ya da derleyicide bir bug ya da derleyici her şeyi herkes için düşünmek zorunda değildir.

 
Büyük olasılıkla bir bug değil, basit nesnelerin atanması işe yaramalı, o zaman yeni oluşturulan nesneyi silmeye özen göstermeniz gerekiyor.
 
Dmitry Fedoseev :

O zaman derleme yapmamalı. Ya da derleyicide bir bug ya da derleyici her şeyi herkes için düşünmek zorunda değildir.

Bingo!

SemenTalonov 2019.01.10 07:36 POINTER_DYNAMIC türünde bir işaretçi depolamaya izin verir ve bunun tersi de geçerlidir .
Neden: