Danleonhart Posted February 5, 2012 Report Share Posted February 5, 2012 (edited) 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 February 15, 2012 by Danleonhart Quote Link to comment Share on other sites More sharing options...
0 Danleonhart Posted February 5, 2012 Author Report Share Posted February 5, 2012 Bem, achei algo, mas aceito opiniões :rolleyes: http://www.linhadecodigo.com.br/artigo/110...o-de-um-gc.aspx Quote Link to comment Share on other sites More sharing options...
0 kuroi Posted February 12, 2012 Report Share Posted February 12, 2012 (edited) 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 estaticamenteEnd 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 February 12, 2012 by kuroi Quote Link to comment Share on other sites More sharing options...
0 Danleonhart Posted February 12, 2012 Author Report Share Posted February 12, 2012 OK ! Eu desisti de criar algo parecido com o GC do VS para o VB-6...mas foi muito instrutivo suas informações...estou a aprender Java...e é uma plataforma completamente diferente, mas não consigo me desamarrar do VB-6 :rolleyes: VALEU ! Quote Link to comment Share on other sites More sharing options...
Question
Danleonhart
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:
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 DanleonhartLink to comment
Share on other sites
3 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.