duvida sobre malloc()

duvida sobre malloc()

por Wilson Kazuo Mizutani -
Número de respostas: 11
Oi, queria saber se tem algo de errado em fazer isso:

int *p;
do {
p = (int*) malloc( <valor>*sizeof(int) );
} while(p == NULL);

Isso é, tem algo de errado em ficar tentando alocar memória até conseguir? Ou isso é arriscado? Porque se for, então o melhor é retornar assim que o programa perceber que não conseguiu memória? Isso pode fazer meu EP falhar dependendo do quanto de memória disponível tem o computador que o executa, o que não seria legal ^^".
Em resposta à Wilson Kazuo Mizutani

Re: duvida sobre malloc()

por Paulo Cheadi Haddad Filho -
Eu tava pensando em usar isso tb, só que durante uma iteração i, com o <valor>[i+1] < <valor>[i].

Aí meio que desisti, porque não sabia como medir qual era o tamanho na RAM consumida por isso, que podia ainda ser grande e não-viável.

Talvez no mesmo contexto disso, fui fuçar no comando 'time' do Linux e vi que ele pode retornar outras informações, tipo o espaço consumido em memória, mas não consegui fazer ele funcionar. Sei que seria bem útil... =/

Por fim, tem alguma forma conhecida de ser medir o espaço consumido em memória?
Em resposta à Paulo Cheadi Haddad Filho

Re: duvida sobre malloc()

por Fernando Aluani -

"Por fim, tem alguma forma conhecida de ser medir o espaço consumido em memória?"

Pelo menos no Windows, um jeito facil de fazer isso fora do seu programa (nao no codigo) eh abrindo o gerenciador de tarefas, e vendo o "uso de memoria" do processo do seu programa (<nome do programa>.exe) :P

Em resposta à Fernando Aluani

Re: duvida sobre malloc()

por Paulo Cheadi Haddad Filho -
Esqueci de especificar...

É no Linux. =)
Em resposta à Paulo Cheadi Haddad Filho

Re: duvida sobre malloc()

por Tiago Madeira -
top no Unix é algo como um "gerenciador de tarefas" do Windows, mas melhorado sorriso

No entanto, pra medir uso de memória sugiro o Valgrind: http://valgrind.org/
Em resposta à Tiago Madeira

Re: duvida sobre malloc()

por Wilson Kazuo Mizutani -
No caso, eu até tenho noção de quanta memoria to usando. Meu problema é saber se quem corrigir o EP vai ter essa memoria.
O Alexandre (monitor) disse que até uns 200mb é o ideal. Mas e se nem isso houver? Ou mesmo que haja, mas demore para estar disponivel? O tempo de execução do meu EP fica comprometido, porque estarei tentando pegar essa memoria até que consiga. E caso deva simplesmente desistir se não peguei a memória, então nem resultado o EP tem naquela execução...
Em resposta à Wilson Kazuo Mizutani

Re: duvida sobre malloc()

por Tiago Madeira -
Você tem noção exata de quanto você usa? Se for 250mb não acho que tenha problemas; se for mais de 500mb acho que é um exagero. Calcule a memória no pior caso.

De qualquer forma, 200mb de memória é mais do que meu sistema operacional inteiro usa, com Firefox aberto. E são mais de 50 milhões de inteiros. Eu acho que se seu programa usa mais que isso você deveria pensar em fazer de outra maneira. É realmente necessário tudo isso? Será que não há uma estrutura de dados mais apropriada?

Não creio que você esteja fazendo isso, mas acho bom comentar: Se você tentar alocar algum dos valores da entrada (que pode chegar a 2^64-1), o uso de memória passa de 60 milhões de terabytes sorriso
Em resposta à Tiago Madeira

Re: duvida sobre malloc()

por Paulo Cheadi Haddad Filho -
Pô, ainda bem que vc já avisou disso, aheuauhe!

Então, ainda no contexto do malloc:

tenho uma struct, aí dou (em linguagem meio porca, só pra entender)
var = malloc(1, sizeof(struct))

No final eu devo dar free(var)?

Se sim, eu tava dando, mas ele tava dando um erro bem grandinho... XD
Em resposta à Paulo Cheadi Haddad Filho

Re: duvida sobre malloc()

por Tiago Madeira -
Se você está fazendo:

struct x *var;
var = malloc(sizeof(struct x));
free(var);

... deveria funcionar.
Em resposta à Tiago Madeira

Re: duvida sobre malloc()

por Paulo Cheadi Haddad Filho -
XD

Putz, sei lá então...

Acho melhor deixar lá no EP comentado que dá esse problema então.
Em resposta à Paulo Cheadi Haddad Filho

Re: duvida sobre malloc()

por Joao M. Miranda -
Para medir memória e encontrar licks o valgrind que o Tiago falou é muito bom! http://valgrind.org/. Vale muito a pena aprender a usar minimamente (pelo menos para 122 e Estrutura de Dados (ED))

Quanto ao malloc, o mais comum é tentar alocar a memória e, caso não der certo (p == NULL), aborta o programa e retorna -1 (indicando falha). Fazer um loop para tentar alocar pode ser um problema, pois se houve alguma falha na alocação, é provável que ela vá continuar e seu programa pode entrar em loop.



Em resposta à Wilson Kazuo Mizutani

Re: duvida sobre malloc()

por Alexandre da Silva Freire -
Se o malloc devolveu NULL eh porque nao tem memoria disponivel, entao nao adianta tentar varias vezes. Meu conselho de monitor e de amigo: nao complique as coisas; ao contrario, tente sempre escolher a solucao mais simples. Neste EP nao ha necessidade de usar malloc. Se voce quer usar um vetor de memoizacao, aloque-o estaticamente ("int v[MAX];", para algum valor MAX que seja razoavel), e use este mesmo vetor ao longo de toda a execucao. Alguns podem pensar: mas se o MAX for grande e a entrada for pequena o meu programa vai ficar lento para esta entrada. Resposta: se preocupe 99,99999...% com as entradas grandes e 0,0000...1% com as entradas pequenas. Por pior que seja o programa ele eh satisfatorio para entradas pequenas.

Obs.: Desculpem a falta de acentos.