Perguntas de um "boneco" - página 106

 
uncleVic:
Tarefa... Por favor, anexar um módulo de sinal (não tenho um). Vamos dar uma vista de olhos.
Arquivos anexados:
 
openlive:

É ainda mais esquisito. O efeito não está a fazer sentido para mim.
 
uncleVic:

Ainda mais esquisito. Não consigo obter o efeito.

efeito apenas durante a inicialização, no testador tudo é normal

OK, não preciso dele, não preciso mesmo dele.

 

O indicador Zigzag lê valores que já não existem (devem ter existido antes de serem redesenhados). Isto pode ser evitado?

Se os valores estão no buffer, porque é que não está a desenhar novamente.

 

Boa tarde, por favor explique o seguinte:

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

Tenho duas classes, acredito que a instância da próxima geração (base - criança - criança2 - ...), ocupa cada vez mais espaço na memória. Para o operador Novo, dizemos exactamente quanta memória a atribuir, passando a classe em parâmetros. Mas no operador de eliminação, não dizemos exactamente quanta memória a atribuir. Partindo deste raciocínio, não é muito claro o que irá acontecer na próxima situação:

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

Isto é, declaramos *pClass como um ponteiro para Cbase (uma classe pequena em comparação com Cchild), mas na verdade aponta para Cchild. Daí a questão, como se comportará aeliminação()? Irá libertar o número de bytes igual ao tamanho do Cbase (então a memória ficará entupida), ou irá a eliminação ocorrer correctamente?

P.S: bem, mais uma pergunta sobre o assunto: existe algum rótulo na área de memória atribuída (novo), com o qual possamos compreender o tamanho desta área (algo como char armazenado com terminador nulo no final)? Ou por outras palavras, pode um pedaço de código que não sabe nada sobre os tamanhos das aulas que declarei correctamente libertar a memória?

 

220Volt:

A questão é, como se comportará aeliminação()? Irá libertar um número de bytes igual ao tamanho Cbase (então a memória ficará entupida), ou irá apagar correctamente?

Naturalmente, libertará correctamente a memória.

P.S: bem, mais uma pergunta sobre o assunto: existe alguma etiqueta na área de memória atribuída (nova), pela qual possamos compreender o tamanho desta área (algo como char armazenado com terminador zero no final)? Ou por outras palavras, pode um fragmento de código que nada sabe sobre o tamanho das aulas que declarei correctamente libertar a memória?

tamanho de ?
 
sergeev:

claro que o removerá correctamente. pode espalhar os pontos de tijolo sobre os desestruturadores

Trata-se de saber de onde vem esta pergunta. Fi-lo aproximadamente como descrito (o destruidor não era virtual), e os destruidores abaixo da classe do ponteiro não foram chamados.
 
sergeev:
tamanho de ?
Penso no tamanho dos trabalhos em tempo de compilação, mas estou a falar de libertar a memória de outro processo, por exemplo. Se isto for possível, então penso que a função de apagar seria compreensível.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
Os destruidores na MQL5 são sempre virtuais. Tudo é apagado correctamente, tente colocar Print(__FUNCSIG__); em destruidores.

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
A questão não é ainda mais sobre o que estabelecemos nas funções de classe através de novas funções, mas sobre os dados de classe dos seus membros "nativos". Afinal de contas, também não são espaços vazios.
Razão: