Jump to content
Fórum Script Brasil
  • 0

[OFF] Garbage Colector no VB-6


Danleonhart

Question

Pessoal...

Acho que já ouviram falar do GC do VS 2010 (Garbage Colector = Coletor de Lixo)...

Tenho um projeto que tem 34 variáveis e gostaria de destruílas todas antes de encerrar a aplicação...

Estou usando o método tradicional:

'Para String, Integer, Long, Single, Byte, Boolean:

      variavel = Empty

  'Para objetos:

      Set objeto = Nothing

  'Para Arrays
     
      Erase variavel_Array

Gostaria de saber se tem uma maneira mais prática de se fazer isso...

de preferência sem utilizarAPI (senão deixa de ser prática :D)

VALEU !!!

Edited by Danleonhart
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Então, danleon, mas acontece que o Garbage Collector, acredito, é usado apenas para gerenciar a alocação dinâmica.

No Visual Basic fica um pouco difícil de verificar o que é alocação dinâmica, mas isso é uma coisa que fica muito claro quando trabalhamos com C/C++.

Não deve haver necessidade de limpar variáveis comuns, pois elas são alocadas estaticamente.

A alocação dinâmica seria aquela que fazemos explicitamente no código fonte. Já a alocação estática é aquela que é feita automaticamente pelo programa sem que precisemos interferir.

Exemplo de alocação estática:

Private Sub Exemplo()
    Dim var As Long 'A variável é alocada estaticamente
End Sub 'A variável é desalocada[/code] Nesse caso, assim que a sub Exemplo() for chamada, deve ser alocado todo o espaço que for usado por variáveis internas (no exemplo, somente a variável var -- melhor dizendo, as variáveis devem ser alocadas no momento em que o Dim for executado). Assim que acaba a execução dessa sub, todos os espaços devem ser liberados. Assim, a variavel var é alocada na abertura da sub e desalocada ao final dela, sem que precisemos nos preocupar. Fazer variavel = Empty também é desnecessário, pois isso vai limpar o valor que está dentro do espaço alocado (deve mudar todos os bits pra 0), mas não irá desalocá-lo. Mesmo depois do Empty, você deve conseguir usar a variável normalmente. Agora, quanto à alocação dinâmica, ela é usada geralmente com objetos, pois usamos um ponteiro para apontar diretamente para a posição de memória onde ele está. Exemplo:
[code]Private Sub Exemplo()
    Dim obj As ObjetoQualquer 'Aqui, um ponteiro para o objeto é alocado estaticamente, como uma variável qualquer.

    Set obj = New ObjetoQualquer 'Aqui, alocamos dinamicamente o objeto numa posição qualquer da memória e apontamos nosso ponteiro para lá.

    Set obj = Nothing 'Aqui, limpamos toda a área de memória que estava ocupada pelo objeto, após a alocação feita na linha acima.
End Sub 'Aqui, o ponteiro também é desalocado, pois como eu disse, ele é, basicamente, uma variável qualquer.
Sendo assim, quando alocamos o objeto usando o New, ele ocupa uma área de memória alheia àquela pertencente a essa sub. Por conta disso, é recomendável que façamos a limpeza dessa área manualmente (setando o Nothing) para garantir que ela aconteça, principalmente porque o próprio objeto pode ter um outro objeto dentro dele, ou pode ter alocado dinamicamente outras porções de memória que também devem ser limpadas. Quanto a arrays e matrizes, acredito que devem funcionar também como as variáveis comuns, quando declaradas com posições já fixas (exemplo: Dim arr(10) as Long). Ou seja, não há necessidade de desalocarmos explicitamente. Agora, os arrays de tamanhos variáveis (aqueles que podemos redimensionar a qualquer momento, usando ReDim), imagino que esses sim precisemos desalocar.
Private Sub Exemplo()
    Dim arr() As Long 'Isso aqui também deve ser só um ponteiro vazio.

    ReDim arr(10) 'Alocamos dinamicamente os 10 índices numa posição qualquer da memória

    Erase arr 'Aqui desalocamos os 10 índices.
End Sub[/code]

E também acho que vale a pena comentar quanto às Strings. As strings também são um ponteiro que apontam para o local onde está a string verdadeira.

Mas imagino que também não haja a necessidade de desalocá-las explicitamente, e que o programa tome conta disso como faz com as variáveis comuns.

A verdade é que, quando você preenche uma strings de tamanho variável, ele aloca uma certa quantidade de memória (acredito que somente o suficiente para armazenar o número de caracteres que você está passando pra dentro dela). Quando você adiciona ainda mais caracteres na string, ultrapassando o limite alocado, deve ser necessário mover a string para uma nova posição de memória, onde caiba todo o texto que você queira colocar.

Sendo assim, a movimentação de memória no uso de strings é intensa (a todo momento, são desalocados e alocados novos espaços), seria inconcebível que tenhamos que fazê-la nós mesmo.

Quanto ao Garbage Collector, em algumas linguagens, como no ambiente .NET por exemplo, o GC existe para que não precisemos nos preocupar com isso em nenhum momento, fazendo todo o trabalho pra gente.

No Visual Basic, você não tem muita alternativa. O artigo do Denis pode ajudar, mas, ainda assim, você tem que ficar de olho nos objetos e saber qual o momento certo pra se livrar de cada um dos objetos.

Bom, acho que nem todos se preocupam com esse assunto. Muitos podem ler esse texto e dizer "O quê? Que perda de tempo, nunca fiz nada disso e nunca me atrapalhou!".

Realmente, hoje em dia, gerenciamento de memória não é um problema tão grande quanto era há 15 anos atrás. Em aplicações pequenas, você realmente não deve notar nenhuma diferença, mas se você for fazer programas que trabalhem com grandes quantidades de dados, um mau uso da memória pode acabar trazendo grandes problemas.

Além do mais, é melhor garantir desde o começo que seu programa funcione de forma limpa, pois você pode não ter certeza do que ele vai se tornar no final, de como os outros vão querer utilizar, nem os recursos do computador onde vai ser instalado.

Lembrando que, quando o aplicativo é encerrado, o gerenciador de memória do windows, que, esperamos que reconheça todas as áreas da memória que pertenciam ao seu programa, deve liberá-las automaticamente. Ainda assim, é recomendável que limpemos os espaços explicitamente para prevenir possíveis erros.

Além disso, para objetos que são criados e destruídos constatemente dentro da aplicação, pode ser imprenscindível que o façamos, pois a memória ocupada desnecessariamente pode prejudicar ao seu próprio programa, se ele ainda está em uso.

Edited by kuroi
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...