Jump to content
Fórum Script Brasil
  • 0

O destrutor está sendo executado indevidamente.


Ricardo Martins

Question

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.

Edited by Ricardo Martins
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...