Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
amzero

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

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Então, isso que está complicado. Estou fazendo no visual studio 2012 e simplesmente para a execução e abre uma janela:

    "Projeto.exe has trigged a breakpoint."

    e abre o código de um arquivo _file.c.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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;

    Compartilhar este post


    Link para o post
    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.

    Editado por ScreenBlack
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Cara, muito obrigado pela ajuda mas tentei utilizar esse retorno do NULL e mesmo assim não funcionou.

    Vou pedir ajuda a um professor aqui por que os códigos são muito extensos. 

    Obrigado.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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];
    Editado por amzero

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×