Discussão do artigo "A Ordem de Destruição e Criação do Objeto em MQL5"

 

Novo artigo A Ordem de Destruição e Criação do Objeto em MQL5 foi publicado:

Cada objeto, quer seja um objeto personalizado, um array dinâmico ou um array de objetos, é criado e excluído no programa MQL-5 desta forma em particular. Geralmente, alguns objetos são parte de outros objetos, e a ordem de exclusão do objeto na desinicialização se torna especialmente importante. Este artigo fornece alguns exemplos que cobrem os mecanismos de trabalho com objetos.

Os programas MQL5 são escritos em conceitos de programação orientada de objeto (OOP), e que não só abre novas possibilidades para a criação de bibliotecas personalizadas, mas também permite que você use as classes testadas e completas de outros desenvolvedores. Na Biblioteca Padrão, que está incluída no terminal do cliente MetaTrader 5, há centenas de classes que contém milhares de métodos.

Para tirar vantagens da OOP precisamos esclarecer alguns detalhes sobre a criação e exclusão de objetos em programas MQL5. A Criação e Exclusão de Objetos é brevemente descrita na documentação, e este artigo ilustrará este tópico nos exemplos.

Autor: MetaQuotes Software Corp.

 

Quando o LocalVar_TestScript_2.mq5 é executado pela primeira vez, ele fornece apenas

PO      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
LD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
HJ      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
DS      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
PH      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
GP      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
KF      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
OM      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
CD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
GK      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor

ou seja, sem a mensagem"delete invalid pointer" (excluir ponteiro inválido). Após recompilar o mesmo arquivo (ou seja, após a segunda compilação), ele mostra isso:

PQ      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
LH      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
HO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
DF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
PL      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
GR      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
KK      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
OP      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
CF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
GO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
PH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
RP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
DH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
FP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
HH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
A reação do terminal à exclusão de ponteiros inválidos foi alterada desde que o artigo foi publicado? XP, 32
 
Yedelkin:

Quando o LocalVar_TestScript_2.mq5 é executado pela primeira vez, ele fornece apenas

ou seja, sem a mensagem"delete invalid pointer" (excluir ponteiro inválido). Após recompilar o mesmo arquivo (ou seja, após a segunda compilação), ele mostra isso:

A reação do terminal à exclusão de ponteiros inválidos foi alterada desde que o artigo foi publicado? XP, 32
Obrigado pela mensagem. Corrigido. O comportamento mudou, agora a mensagem"delete invalid pointer" (excluir ponteiro inválido) é gerada somente durante a compilação para depuração.
 

mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.

OK, gostaríamos de ver um esclarecimento sobre o artigo.
 

Por que essa linha faz com que o construtor seja executado?

 CItem* array1[5];

e esta não:

CObjectC *pObjectC;
?
 
O operador new é necessário apenas para tornar a classe dinâmica? Mas se uma matriz dinâmica é "uma matriz com um valor não especificado no primeiro par de colchetes", o que é uma classe dinâmica?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Por que essa linha faz com que o construtor seja chamado:

Eu verifiquei, nenhuma chamada ao construtor foi feita. Anexe o código inteiro
 
Burgunsky:

E por que essa linha faz com que o construtor seja executado: CItem* array1[5];,

mas esta não: CObjectC *pObjectC; ?

Eu entendi que a linha

CItem* array1[5];

por si só não faz com que o construtor seja iniciado. Aqui está o código mais completo do artigo:

void OnStart()
  {
//--- declarar a primeira matriz de ponteiros para o objeto
   CItem* array1[5];
//--- declarar a segunda matriz de ponteiros para o objeto
   CItem* array2[5];
//--- agora vamos preencher as matrizes no loop
   for(int i=0;i<5;i++)
     {
      //--- o ponteiro para a primeira matriz será criado pelo operador new
      array1[i]=new CItem;
      //--- o ponteiro para a segunda matriz será copiado da primeira matriz
      array2[i]=array1[i];
     }
O construtor é chamado não ao declarar a primeira matriz de ponteiros, mas ao preencher essa matriz em um loop usando o operador new.
 
Burgunsky:
O operador new é necessário apenas para tornar a classe dinâmica? Mas se uma matriz dinâmica é "uma matriz com um valor não especificado no primeiro par de colchetes", o que é uma classe dinâmica?
Entendi que a palavra "dinâmica" em programação é polissêmica. Quando se trata de classes, há uma oposição: "objeto criado automaticamente" versus "objeto criado dinamicamente". A diferença entre eles é aproximadamente a mesma que existe entre as variáveis declaradas em nível global e as variáveis declaradas em nível local. Em outras palavras, um "objeto criado dinamicamente" é um objeto criado "por um tempo", cuja vida útil vai do momento da criação pelo operador new até o momento da exclusão pelo operador delete.
 

Mas ainda há dúvidas:

Qual é a vantagem de criar um objeto dinâmico por meio do operador new?

Ao criar um objeto automaticamente, o objeto de classe é criado na pilha, o que é mais rápido do que o objeto dinâmico em termos de tempo de execução.

Ao criar um objeto dinamicamente, o objeto de classe é criado na memória (no heap) enquanto se usa o gerenciador de memória do sistema operacional, o processo é mais lento.

Aqui vai uma pergunta: se a criação automática é mais rápida, por que os objetos dinâmicos são criados? Para evitar que a pilha transborde?

 
Attached source code files and source code insets in HTML code are now completely translated into Portuguese for your convenience.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.