[ +/- ] [ Data/Hora: 22 Mai 2013, 22:51 ]


Criar um novo TópicoWrite comments Página 1 de 1   [ 5 posts ]
Autor Mensagem
 Assunto da Mensagem: [duvida] Passagem de objetos por referencia
MensagemEnviado: 13 Fev 2012, 09:58 
Membro
Avatar do Utilizador

Registado: 13 Fev 2012, 08:17
Mensagens: 7
Localização: Teresina - PI
Ai galera da Unidev sou novo aqui no fórum e ingressei para aprofundar meus conhecimentos de programação de jogos e em C++. :D
Bom vou a dúvida.
Seja uma classe qualquer chamada A temos:
Code:
public class A
{
public:
  A() { CreateDevice(&teste); } // Só um exemplo, eu sei que tem mais parâmetros
  ~A() { if (teste) teste->Release(); }
  D3DirectDevice9 *teste; // Objeto de dispositivo da api DirectX9
};


Seja AddList o metodo para o exemplo, temos:
Code:
AddList(const A &a)
{
  // Qualquer operação
} // Dúvida - Ao terminar este metodo ele executa o destrutor da classe com uma
   //peculiaridade descrita abaixo, por que?


Função main():
Code:
A a;
AddList(a);
AddList(a); // Peculiaridade -- A partir daqui ele executa o destrutor de A e
                // executa o Release()
AddList(a);  // Aqui da erro de "Acess Violation"  porque mesmo já executado o Release()
                 // ele entra no if do destrutor de novo e tenta da o Release ai fornece o erro,
                 // Esta peculiaridade é minha outra dúvida.


Tirei essas informações de execução do debug do VS 2010 olhando a Call Stack (Pilha de execução) e com isso impaquei na criação de meu pequeno jogo xD.

Desde já agradeço a todos.

_________________
C++ is the POWER


Topo
 Perfil  
 
 Assunto da Mensagem: Re: [duvida] Passagem de objetos por referencia
MensagemEnviado: 13 Fev 2012, 11:22 
Membro Avançado

Registado: 23 Nov 2003, 18:58
Mensagens: 2812
Localização: Brasil
Se sua classe possui destrutor, certamente vai precisar de:
* operador de atribuição
* Construtor de copia

O codigo abaixo:
Code:
AddList(const A &a)
{
  // Qualquer operação
}


Não vai invocar o destrutor de a, mas o "Qualquer operação" pode causar isso, se você ali por algum motivo, deixar de usar a referência e atribuir a instância "a" a um dado concreto (não referência) criado localmente, o destrutor vai ser invocado, não do objeto passado como parâmetro, mas do definido localmente.

Eu acredito que a sua lista não pegue os valores por referência, então pode ser ai seu problema.

Como você não definiu operador de cópia, não definiu construtor de cópia, ambos vão referenciar o mesmo objeto (IDirect3dDevice), que no final vai ser destruído e os objetos "sobreviventes" vão referenciar o objeto destruído.

Você tem que criar o construtor de cópia e o operador de atribuição, seja para definnir como private e bloquear cópias, ou definir eles de forma correta a copiar o device.

T+

_________________
Quer aprender a fazer jogos?
http://www.pontov.com.br/
Meus jogos


Topo
 Perfil  
 
The following user would like to thank bcsanches2 for his or her post: Visitante
 Assunto da Mensagem: Re: [duvida] Passagem de objetos por referencia
MensagemEnviado: 13 Fev 2012, 12:03 
Membro
Avatar do Utilizador

Registado: 13 Fev 2012, 08:17
Mensagens: 7
Localização: Teresina - PI
bcsanches2 sua explicação foi muito boa.
Realmente vi no Debug que está usando o mesmo objeto Device, mas não tem que ser assim já que é o mesmo objeto referênciado(confusão em ponteiros xD) ?

Bom vou mostrar como está o processo do metodo AddList()
Code:
vector<A> elemA;

AddList(const A &a)
{
    elemA.push_back(a);
}

Como pode ver não é uma variavel local em "qualquer operação" mas o destrutor é chamado xD.

Desde já agradeço.

_________________
C++ is the POWER


Topo
 Perfil  
 
 Assunto da Mensagem: Re: [duvida] Passagem de objetos por referencia
MensagemEnviado: 13 Fev 2012, 12:08 
Membro Avançado

Registado: 23 Nov 2003, 18:58
Mensagens: 2812
Localização: Brasil
vector<A> é um vetor de objetos A, ele armazena os objetos localmente, logo:

elemA.push_back(a);

Cria um A temporário para ser passado como parâmetro para push_back, cria uma novo A que é o objeto que vai ficar dentro do vector. Ambos vão copiar o mesmo ponteiro do device, pois você não definiu construtor de cópia e nem operador de atribuição, logo apenas o ponteiro é copiado.

Na sequencia o método push_back retorna, o A craido temporariamente destruído e seu destrutor invocado, logo ele da release no device e todos os outros objetos passam a ter ponteiros inválidos.

Você tem que eliminar essa cópia ou então fazer o construtor de cópia e operador de atribuição.

Como o device é um objeto COM, basta incrementar a referência dele.

T+

_________________
Quer aprender a fazer jogos?
http://www.pontov.com.br/
Meus jogos


Topo
 Perfil  
 
The following user would like to thank bcsanches2 for his or her post: Visitante
 Assunto da Mensagem: Re: [duvida] Passagem de objetos por referencia
MensagemEnviado: 13 Fev 2012, 13:29 
Membro
Avatar do Utilizador

Registado: 13 Fev 2012, 08:17
Mensagens: 7
Localização: Teresina - PI
Obrigado bcsanches2, minhas dúvidas foram esclarecidas.

_________________
C++ is the POWER


Topo
 Perfil  
 
Mostrar mensagens anteriores:  Ordenar por  
Criar um novo TópicoWrite comments Página 1 de 1   [ 5 posts ]
Similar topics
[DUVIDA] Sistemas
Fórum: Unity3D
Autor: calzcifer
Respostas: 3
DUVIDA NO DELPHIX
Fórum: Pascal/Delphi
Autor: lulukiller95
Respostas: 0
Uma duvida
Fórum: OFF-Topic
Autor: yargonxp
Respostas: 3
Contrutores em C++ dúvida
Fórum: C/C++
Autor: pragma
Respostas: 2
Duvida
Fórum: Modelagem 3D
Autor: pacmanx
Respostas: 1
Topo


Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 4 visitantes


Criar Tópicos: Proibído
Responder Tópicos: Proibído
Editar Mensagens: Proibído
Apagar Mensagens: Proibído

Pesquisar por:
Ir para:  

cron


Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840