Ir para conteúdo
Fórum Script Brasil
  • 0

O destrutor está sendo executado indevidamente.


Ricardo Martins

Pergunta

Vamos supor que eu tenha o seguinte código:

#include <stdio.h>
#include <conio.h>

int main ()
{
  struct TEST
  {
    int num;
    ~TEST ()
    {
      printf ("Você está dentro do destrutor!\n");
      getch ();
    }
  };
  TEST exemplo= {0};
  exemplo.num= 0;
  exemplo= (TEST) {0};
  
  return 0;
}
O código é bem simples. Primeiro eu crio uma estrutura com o nome TEST que contém: - Um variável para um número inteiro - Um destrutor que só imprimi uma mensagem na tela Depois eu demonstro as três formas possíveis de atribuição pra variável dentro da estrutura: - Na inicialização - Na atribuição individual de elementos de estrutura - Na atribuição em lote (que no caso é com um elemento só) Os destrutores só são executados quando a estrutura é destruída, ou seja, ou quando termina o bloco a qual ela pertence, ou quando é usada a desalocação dinâmica (usando delete). Nesse caso, estranhamente o destrutor é executado duas vezes. Se fosse uma vez só seria compreensível, já que a função main termina, a estrutura é destruída e o destrutor é executado. Daí eu percebi que a seguinte linha executa o destrutor, indevidamente, diga-se de passagem:
exemplo= (TEST) {0};

Se você comentar ela, o destrutor é executado uma vez só, como tem que ser.

Por que essa linha executa o destrutor?

Se for de alguma relevância, eu fiz isso usando o wxDev-C++ 7.3.1.3.

Editado por Ricardo Martins
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
exemplo= (TEST) {0};

é q essa linha faz o seguinte: uma struct Teste é alocada em alguma regiao qualquer da memoria a partir de (TEST) {0}. essa struct alocada é então toda copiada para a regiao da memoria onde esta a struct declarada como exemplo. depois da copia, o espaco q foi alocado originalmente por (TEST) {0} é destruido. ou seja, a primeira passagem pelo destructor é na verdade no destructor da struct q foi alocada num espaco qualquer apenas para ser copiada em exemplo. a struct exemplo continuada alocada.

a segunda passagem no destructor, essa sim esta destruindo a struct exemplo. ela ocorre quando o programa é encerrado e a memoria esta sendo desalocada.

há um tempo atras tb tive uma duvida parecida, mas no caso era com objetos e não na struct: http://scriptbrasil.com.br/forum/index.php?showtopic=147333

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...