Ir ao conteúdo
  • Cadastre-se

Alocação Dinâmico com New E Delete em C++


amzero

Posts recomendados

Olá galera,

 

queria saber se eu fiz a alocação e desalocação corretamente:

O primeiro método para alocar:

Solucao * Inicializar_Solucao_SSD(){	Solucao * Sol = new Solucao();	Sol->Vet = new double*[2];	Sol->Vet[0] = new double[FONTES_EFLUENTES];	Sol->Vet[1] = new double[FONTES_EFLUENTES];		return Sol;}

e para desalocar:

void Liberar_Solucao_SSD(Solucao * Sol){	delete[] Sol->Vet[1];        delete[] Sol->Vet[0];	delete[] Sol->Vet;	delete Sol;}

Creio que esteja certo, mas não faço ideia do erro que está ocorrendo em que depois de milhares de iterações a primeira linha do Liberar_Solucao_SSD(), o delete[] Sol->Vet[1]

dá erro. e se retirá-lo e deixar o delete[] Sol->Vet[0], o programa não dá erro. Não faço ideia do que está acontecendo.

 

Agradeço qualquer ajuda.

Link para o comentário
Compartilhar em outros sites

Eu tinha corrigido isto, na verdade não é uma classe, é um Struct.

Corrigindo:

Solucao * Inicializar_Solucao_SSD(){	Solucao * Sol = new Solucao;	Sol->Vet = new double*[2];	Sol->Vet[0] = new double[FONTES_EFLUENTES];	Sol->Vet[1] = new double[FONTES_EFLUENTES];		return Sol;}

e a estrutura solução:

typedef struct solution{	double ** Vet;	double FO; 	double Equidade;	double ViolacaoOD;	double ViolacaoDBO;	double Xi;	double Yi;	double mediaXi;	double mediaYi;}Solucao;
Link para o comentário
Compartilhar em outros sites

Não consegui encontrar esse erro.

Segue a rotina que usei:

#define FONTES_EFLUENTES 5    for ( i = 0; i < 200; i++ )    {        for ( j = 0; j < 5; j++ )        {            Sol = Inicializar_Solucao_SSD();            Sol->Vet[0][j] = 10.5 + ( (i+1) * (i+1) );            Sol->Vet[1][j] = 10.5 + ( (i+2) * (i+1) );            cout << "[ " << i << " ][ " << j << " ]: " << Sol->Vet[0][j] << endl;            cout << "[ " << i << " ][ " << j << " ]: " << Sol->Vet[1][j] << endl;            Sol = Liberar_Solucao_SSD(Sol);        }    }

Alterei a função que libera a estrutura, para que retorne NULL, apenas para 'zerar' a variável na rotina principal:

Solucao * Liberar_Solucao_SSD(Solucao * Sol){    delete[] Sol->Vet[1];    delete[] Sol->Vet[0];    delete[] Sol->Vet;    delete Sol;     return NULL;}
 

Tem como passar mais detalhes?

Att.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Camarada, consegui algo instalando o Visual C++ 2010.

 

 

"'Testando2010.exe': Carregado 'C:\Users\Avell B153\Desktop\Testando2010\Release\Testando2010.exe', Símbolos carregados.

'Testando2010.exe': Carregado 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'Testando2010.exe': Carregado 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Testando2010.exe': Carregado 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'Testando2010.exe': Carregado 'C:\Windows\SysWOW64\msvcr100.dll', Cannot find or open the PDB file
HEAP[Testando2010.exe]: Heap block at 006491C8 modified at 006491F8 past requested size of 28
O Windows disparou um ponto de interrupção no Testando2010.exe.
 
Isso pode ocorrer devido a corrupção do heap, que indica um bug na Testando2010.exe ou em qualquer outra DLL que carregou.
 
Isso também pode ocorrer porque o usuário pressionou F12 enquanto Testando2010.exe realizou o foco.
 
A janela da saída pode ter mais informações sobre o diagnóstico."

 

 
E para justamente no mesmo ponto:
delete[] Sol->Vet[1];
Link para o comentário
Compartilhar em outros sites

@amzero

 

 

O problema deve ser no restante das milhares de linhas que devem compor o seu programa. O código que você postou e depois o postado pelo @ScreenBlack na forma de um exemplo para teste não apresentam quaisquer problemas. Veja, é o que temos no instante; e o que temos funciona perfeitamente.

 

 

Sim, testado no g++ e no Visual C++ 2013.

 

 

Veja que consigo reproduzir esse erro que você relata simplesmente escrevendo em posições indevidas da memória:

 

 

heap.png

 

 

Você vai precisar rever todo o seu código para detectar esse tipo de acesso indevido.

 

 

[ ]'s

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...