+ Responder ao Tópico



  1. #1

    Padrão Atribuição de memória dinãmica

    Ai pessoal tou á rasca com este código

    // LIMPEZA DAS ALOCAÃES DINAMICAS DE MEMORIA


    #include <iostream>

    using namespace std;
    int main()

    {

    float *temp;

    for (int f = 0 ; f<7 ; f++) {

    temp = new float [7] ;}// E RESERVADO A MEMORIA DINAMICA DENTRO DO CICLO

    for (int f=0; f<7 ; f++) {

    //cin >> p[f].temp; }

    cin >> temp[f]; } // ACEITE AS TEMPERATURAS PARA CADA DIA

    delete [ ] temp ; // temp; //ELIMINA O ARRAY

    for (int f = 0 ; f<7 ; f++) {

    cout << temp[f] ;}

    }

    Aqui quando faço eliminar o array ele so elimina a 1 º posição as outras não elimina , que possofazer ?? Alguma dica ??

  2. #2

  3. #3
    cassiomarques
    Visitante

    Padrão alocação dinâmica em C++

    Olá,

    Primeiramente: Que código mais feio esse seu hein? Você precisa identar melhor isso, senão quando colcar aqui no fórum fica ilegível para qualquer um que for tentar lhe ajudar!
    Mas vamos lá!

    Você está alocando memória 7 vezes quando só precisa de uma! Vc quer um array de 7 posições para guardar floats certo? Se vc utilizar o ponteiro *temp, tudo o que precisa fazer é

    float *temp = new float[7];

    e pronto! Vc JÁ alocou memória para 7 posiçòes. Vc está fazendo dentro de um laço, repetindo a operação... isso é um vazamento de memória, pois vc aloca 7 arrays, mas usa a mesma referência para eles (o seu ponteiro temp). Quando vc aloca a primeira vez, beleza, tudo está OK. Porém, na segunda iteração do laço vc aloca novamente um array de 7 posições e associa a referência de memória novamente para o ponteiro *temp. Onde foi parar a referência para o primeiro array que vc alocou? Sumiu! Mas a memória continua alocada e vc não vai cosneguir desacolá-la, só se reinicar a máquina... Agora imagina que ao invés de alocar uma array de 7 elementos, vc estivesse alocando uma matriz de 5000 por 5000 elementos! E cada vez que seu laço roda, esse problema se repete! Conclusão deste ponto: Como mostrei acima, só uma vez é o suficiente para gerar um array unidimensional de 7 elementos!

    O segundo ponto no seu código é quando vc fala que não está liberando a memória, somente o primeiro elemento. Um array é na verdade um ponteiro. Todos os arrays são ponteiros na verdade, mesmo que alocados de maneira estática. Quando vc tem um ponteiro utilizado para alocar um array, o que este ponteiro guarda é o endereço de memória para o PRIMEIRO elemento do array. O C++ não se importa em guardar o TAMANHO do seu array, cuidar disso é responsabilidade do programador. Quando vc libera a memória alocada usando delete (ou no seu caso delete[], por ser um array) tudo o que está fazendo é falar para o sistema operacional: "Amigo, não vou mais utilizar esta área de memória, pode marcá-la como livre". Assim que o sistema operacional precise de uma região na memória e ache que naquele momento é viável utilizar essa que vc liberou, ele vai lá e usa. Não quer dizer que vá acontecer imediatamente após vc fazer o delete[] no ponteiro, depende de outros recursos do computador que estiverem sendo utilizados, outros progrmas que estiverem rodando, etc... Por isso, se vc fizer o delete[] e logo em seguida tentar ler o array, é provável que consiga fazê-lo em algumas posições, porque vc ainda tem uma referência para aquela área de memória, apesar dela NÃO PERTENCER MAIS AO SEU PROGRAMA. Entendeu?

    Qualquer dúvida, posta ai!

  4. #4
    cassiomarques
    Visitante

    Padrão

    Citação Postado originalmente por xstefanox Ver Post
    Am... free()?
    Stéfano, em C++ usa-se delete (variáveis simples) e delete[] (arrays) para liberar memória. O free serve apenas para o nosso bom e velho C. Você pode utilizar o free em código C++, mas somente para liberar memória alocada com malloc ou calloc. Fiz uns testes uma vez tentando misturar as coisas (alocar com new e desalocar com free ao invés de delete), mas parece não funcionar muito bem, tive uns "segmentation fault" não muito agradáveis

  5. #5

    Padrão

    Citação Postado originalmente por cassiomarques Ver Post
    Stéfano, em C++ usa-se delete (variáveis simples) e delete[] (arrays) para liberar memória. O free serve apenas para o nosso bom e velho C. Você pode utilizar o free em código C++, mas somente para liberar memória alocada com malloc ou calloc. Fiz uns testes uma vez tentando misturar as coisas (alocar com new e desalocar com free ao invés de delete), mas parece não funcionar muito bem, tive uns "segmentation fault" não muito agradáveis
    Hehehe, mas a idéia foi boa!