| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 10:27:04
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
Alguém poderia me explicar a diferença desses dois códigos? Pelo que entendi ambos criam uma nova pessoa!
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 11:00:12
|
Alberes
Java Ninja
Membro desde: 16/02/2005 10:17:28
Mensagens: 260
Offline
|
O segundo caso é um ponteiro, ao usar ponterio você pode acessar diretamente o valor guardado na variável p.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 11:15:21
|
bezier curve
JavaEvangelist
Membro desde: 28/11/2009 17:55:58
Mensagens: 411
Offline
|
Se ambas as variáveis "pessoa" forem locais, você vai ver que o primeiro objeto é criado na pilha (stack) e o segundo no heap, e acessível via ponteiros.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 11:32:45
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
É o que o bezier falou. No caso do C++, você pode dizer em que área de memória os objetos serão criados. Existem duas possibilidades, cria-las no heap ou no stack. Tudo que é criado no stack é automaticamente destruído assim que sai de escopo. Tudo que é criado no heap (usando new), deve ser explicitamente destruído em algum momento, usando delete. Então, é preciso tomar certos cuidados: 1. Não retornar ponteiros de variáveis criadas no stack: Note que esse código poderia ser corrigido com o uso do new: 2. Não deletar objetos que estejam sendo referenciados por outros objetos; 3. Se preocupar sempre em quem dará o delete no objeto criado com new.
This message was edited 3 times. Last update was at 17/12/2009 11:36:59
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 12:52:01
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
hmmm entendi... obrigado pessoal!
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 13:28:15
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Já que você citou esse assunto, vale a pena falar um pouco sobre a técnica de RAII.
RAII é a sigla para Resource Acquisition is Initialization. A idéia por trás dela é que sempre que um recurso (como memória) for iniciado e tiver que ser posteriormente destruído, você também deverá criar um objeto no stack para gerenciar esse recurso. Considere o seguinte código:
Esse código tem leaks?
A resposta é, sim! Ele pode ter leaks. O que acontece se uma exception for disparada pelo método fazQualquerCoisa1() ou oq->fazQualquerCoisa()? A resposta é: aquele delete não roda, o ponteiro para oq se perde, mas o objeto fica reservado. Problemaço.
Poderíamos colocar o código todo num try...catch:
Mas isso gera um código rebuscado, e sempre há a chance de um programador distraído colocar um return, dentro da linha do try. Qual seria então a melhor solução? Usar RAII.
Primeiro, criamos uma classe, que irá cuidar do ObjetoQualquer. Ela simplesmente guarda o ponteiro para ObjetoQualquer e se encarrega de destrui-lo em seu destrutor.
Então, alteramos nosso código para:
O que acontece agora? ObjetoQualquerManager é um objeto do stack. Lembra-se que falei que a destruição dele era garantida ao final do método? Pois bem, continua garantida, mesmo que sejam dados returns ou estourem exceptions. Mas o que ocorre nessa destruição? O destrutor do manager é chamado, e isso faz com que o delete seja invocado em ObjetoQualquer.
Facilmente, poderíamos reformular essa classe com templates, para que ela se adaptasse para qualquer objeto. Note que eu sobrescrevi o operador de -> para que ele se comportasse de maneira similar a um ponteiro. De fato, poderíamos bolar um template que se comportasse exatamente igual a um ponteiro, mas um ponteiro inteligente, que fizesse essa deleção para nós.
Esse tipo de classe é chamado Smart Pointer. A biblioteca boost, do C++, tem vários ponteiros desse tipo, alguns bem inteligentes com contagem de referências, que tornam o uso do C++ muito parecido com o de uma linguagem com garbage collection. Quem tiver interesse, pode ver a série de artigos sobre smart pointers no Ponto V!: Smart Pointers - Índice
Só cuidado que o índice encontra-se da postagem mais recente até a mais velha, portanto, para ler em série, comece do 8 e vá até o 1.
This message was edited 8 times. Last update was at 17/12/2009 13:37:41
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 13:52:04
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Aliás, falando em new e delete, também podemos citar algumas situações cruéis do C++. Considere a seguinte class: Considere que abc possa ser impresso usando o cout, e que não há eventuais erros de digitação da minha parte, e que o std::cout está importado. Ok, essa classe tem algum problema? Aparentemente não, o código roda as mil maravilhas, o delete é dado no destrutor. Certo? Então, um programador que manja de Java, mas não de C++, faz o seguinte: Tudo certo com esse código, correto? Errado. Esse código irá dar problema na última linha do main. Mas por que???? A primeira linha do método teste, fez uma cópia do objeto xyz. Note que Xyz xyz = xyz1; Está criando um objeto no stack, não um ponteiro ou uma referência. Então, o construtor de cópia padrão do C++ é chamado. O construtor de cópia padrão faz o mesmo que o clone padrão do java. Simplesmente reproduz os valores das variáveis internas, cegamente. Isso inclui copiar o valor do ponteiro pra abc. Quanto o método teste acaba o objeto xyz é destruído. Com isso, é chamado um delete seu ponteiro abc, que aponta para o mesmo lugar do ponteiro do objeto xyz1 recebido como parâmetro! Ao sair do método, portanto, o xyz do main está com um dangling pointer. Um de seus ponteiros internos já não aponta para lugar nenhum. Vem a linha xyz.imprime() no main e: "Este programa executou um comando ilegal e será fechado!" (sorry, my friend, mas vc não pode acessar essa área de memória, isso não te pertence mais!!) Sorte que é possível desabilitar o construtor e o operador de cópia padrão no C++. E é aconselhável que se faça isso sempre. Para isso, basta declara-los na sessão private da sua classe, e não é necessário nem fornecer implementação: Agora, aquele nosso código passa a dar erro na linha 2 do método teste. Ele diz que Xyz xyz = xyz1; É uma operação inválida, já que Xyz não tem construtor de cópia. Smart pointers também podem resolver esse problema. Alguns fazem contagem de referência, permitindo compartilhar o objeto, outros desabilitam a cópia.
This message was edited 2 times. Last update was at 17/12/2009 13:52:58
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 20:16:19
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
Po show de bola ein... temos que pegar todos os posts do Vini e fazer um livro "Dicas de como programar em Java e C++" hehe
brigadao kra
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/12/2009 23:29:12
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
renamed wrote:Po show de bola ein... temos que pegar todos os posts do Vini e fazer um livro "Dicas de como programar em Java e C++" hehe
brigadao kra
É, eu as vezes me empolgo...
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2009 17:57:57
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Por isso existem livros como
Linguagem X para programadores Y.
Estes posts são preciosos, poderiam render artigos, posts e muito mais.
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
|
|