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 敤敬整渠湯搠湹浡捩漠橢捥tA reação do terminal à exclusão de ponteiros inválidos foi alterada desde que o artigo foi publicado? XP, 32
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, 32mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.
Por que essa linha faz com que o construtor seja executado?
CItem* array1[5];
e esta não:
CObjectC *pObjectC;?

- www.mql5.com
Por que essa linha faz com que o construtor seja chamado:
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.
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?
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?

- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.