Perguntas de um "boneco" - página 107

 
mql5:
Os destruidores na MQL5 são sempre virtuais. Tudo é apagado correctamente, tente colocar Print(__FUNCSIG__); em destruidores.


Fi-lo no VC++, mas penso que os mecanismos de libertação de memória são os mesmos, certo?
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
220Volt:
Fi-lo em VC++, mas penso que os mecanismos de libertação de memória são os mesmos?
Não, em C++ deve especificar o destruidor virtual para eliminar correctamente o objecto através da eliminação.

Mas o seu exemplo funcionará correctamente, porque pode especificar destruidor virtual apenas para a classe base.
 

Vou tentar colocar a ideia de uma forma ligeiramente diferente:

Dado:

  • Classe #1 - ocupa 100 bytes em memória.
  • Classe #2 - é descendente da classe #1 e ocupa 200 bytes em memória.
  • Apontador para a classe #1.

Acções:

  • Escrever no ponteiro o endereço da secção de memória onde se encontra uma instância da classe #2 (chamar nova)
  • Área de solda livre, passando a função de apagar para o endereço armazenado no ponteiro.

P.S.: a figura mostra o modelo de memória )

 
Tenho dúvidas porque o ponteiro para a classe número um, mas na verdade a classe número dois está na memória. É importante no caso dos destruidores, por isso perguntei-me se poderia haver aqui também um problema. Penso que nesta situação a libertação correcta da memória só pode ocorrer se houver alguns rótulos na memória (como char com terminador nulo) ou algo do género, foi por isso que perguntei sobre a alocação de memória.
 
220Volt:
Dúvidas porque o ponteiro para a classe número um e na verdade na classe de memória número dois. É importante no caso dos destruidores, por isso estava a pensar se pode haver aqui também um problema. Penso que em tal situação a libertação correcta da memória só pode acontecer se houver alguns rótulos na memória (como o char com o mineiro zero) ou algo do género, foi por isso que perguntei sobre a alocação de memória.

A sua dúvida é porque não especificou os construtores (é importante compreender o que se está a passar neste caso), tente executar este exemplo e compreenderá tudo:

class CFoo
  {
public:
                     CFoo() { Print(__FUNCSIG__); }
                    ~CFoo() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CBar : public CFoo
  {
public:
                     CBar() { Print(__FUNCSIG__); }
                    ~CBar() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   CFoo *f=new CBar();

   delete f;
  }
//+------------------------------------------------------------------+

HZ a construção em si, bem como a eliminação é escalonada, e toda esta informação é armazenada (o próprio ponteiro virtual lembra-se que a classe foi construída como um composto da base e descendente), e ao eliminar, os destrutores são chamados em ordem inversa, da mais recente para a anterior.

 
Não se trata de destruidores, mas sim da própria classe, e mais precisamente de quantos bytes ocupa. Acontece que atribuímos 200 bytes, e depois dizemos-me para libertar a memória, que é apontada por um ponteiro que representa um objecto de 100 bytes de tamanho.
 
220Volt:
Não se trata de destruidores, mas sim da própria classe, e mais precisamente de quantos bytes ocupa. Acontece que atribuímos 200 bytes e depois dizemos-me para libertar a memória apontada pelo ponteiro que representa o objecto com o tamanho de 100 bytes.
Presumo que a sua pergunta esteja relacionada com a forma como funciona a reserva de memória.
Sim, o pool de memória sabe durante quanto tempo um pedaço de memória será libertado por uma chamada de eliminação.
O local onde esta informação é armazenada depende da implementação do pool.

Por exemplo, se der um ponteiro a um objecto em C++ que não é atribuído através de novo, verá como a sua aplicação irá falhar.
 
220Volt:
Não se trata de destruidores, mas sim da própria classe, e mais precisamente de quantos bytes ocupa. Acontece que atribuímos 200 bytes e depois dizemos-me para libertar a memória apontada pelo ponteiro que representa o objecto com o tamanho de 100 bytes.
Presumo que não tenha analisado a minha amostra. Caso contrário, não teria feito tais perguntas.
 
Estava a pensar, lembrei-me que se pode atribuir memória para uma série de int's por exemplo e depois apagar todas elas, apesar do facto de uma int ser pequena, provavelmente a mesma coisa com as classes. Obrigado pelas respostas.
 
mql5:
Compreendo que a sua pergunta tem a ver com a forma como a piscina de memória funciona.
Sim, a reserva de memória sabe quanto tempo uma peça será libertada por uma chamada de eliminação.
O local onde esta informação é armazenada depende da implementação do pool.

Por exemplo, se der um ponteiro a um objecto em C++ que não foi atribuído através de novo, verá como a sua aplicação irá falhar.
É tudo, obrigado.