• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Krull

[C++] Dúvida: Libertar Arrays

18 mensagens neste tópico

A minha duvida é que quero libertar o excesso de memoria alocada para um array por mim defenido.

Tipo:

float vector[20000];

main(){
vector[0]=0.0;
vector[1]=1.0;

///// Agora queria libertar o resto tipo do vector[2] até ao vector[19999]
////
}

E não posso usar a classe <vector>

Peço desculpa de postei isto no sitio errado :P acho que devia ir para duvidas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

penso que a solução passa por alocar dinamicamente o array através do 'calloc' ou 'malloc'.

dessa forma ou alocas apenas o espaço que precisas ou usas o 'realloc'. a função 'free' penso que não vai funcionar nesta situação, pois ela só liberta a memória alocada dinamicamente (e tem que libertar todo um bloco de cada vez).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

penso que a solução passa por alocar dinamicamente o array através do 'calloc' ou 'malloc'.

dessa forma ou alocas apenas o espaço que precisas ou usas o 'realloc'. a função 'free' penso que não vai funcionar nesta situação, pois ela só liberta a memória alocada dinamicamente (e tem que libertar todo um bloco de cada vez).

Exacto, acho que só podes libertar memória criada dinâmicamente com o 'calloc' ou 'malloc'.

Por isso crias um novo array com os valores que queres e fazes free do anterior  :P

Cumpr. bk@ero  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isto é C++ -> operador new! malloc e afins é C.

Mas tudo o que é C pode estar embutido em C++...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se estamos em C++ e o new é nativo, para quê estar a utilizar bibliotecas extra...?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se estamos em C++ e o new é nativo, para quê estar a utilizar bibliotecas extra...?

eu sugeri o 'calloc' ou o 'malloc' para poder usar o 'realloc' para alterar o tamanho do espaço alocado (visto que o 'free' tem de libertar o bloco completo).

se usar o 'new' não sei se é possível redimensionar o espaço alocado.

P.S. também não sei se usar o 'realloc' para diminuir o espaço alocado vai realmente libertar a memória. fiz algumas experiências e o espaço que era libertado dessa forma não estava a ser usado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se usar o 'new' não sei se é possível redimensionar o espaço alocado.

Não, com new/delete não há nada que corresponda a um realloc. É necessário criar um novo objecto, copiar o conteúdo do antigo, e apagar o antigo. Que, suponho, é exactamente o que o realloc faz ::P

Já agora, que experiências fizeste?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, com new/delete não há nada que corresponda a um realloc. É necessário criar um novo objecto, copiar o conteúdo do antigo, e apagar o antigo. Que, suponho, é exactamente o que o realloc faz ::P

Já agora, que experiências fizeste?

mesmo quando queres aumentar o espaço alocado, o 'realloc' tenta alterar o tamanho do bloco actual, se isso não for possível então sim, reserva um novo bloco e copia as informações para o novo bloco. mas neste caso estavamos a diminuir o tamanho do bloco de memória alocado, logo não é preciso andar a copiar o conteúdo do antigo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Certo, só me lembrei disso enquanto almoçava (que foi há 10 minutos ::P ). Supostamente, o realloc deve funcionar assim:

- se (novo tamanho < tamanho antigo) diminui o contador do espaço;

- se (novo tamanho > tamanho antigo)

      se (existe espaço suficiente no bloco actual para o novo tamanho) aumenta o contador do espaço;

      senão encontra um novo bloco onde caiba o novo tamanho, e copia o conteúdo do bloco antigo.

Isto já é um bocado off-topic, mas apeteceu-me divagar... Nota-se que devia estar a estudar :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[...]Supostamente, o malloc deve funcionar assim[...]

'realloc' querias tu dizer, certo? :dontgetit:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, eu estou a fazer um trabalho em que tenho que lidar com strings recebidas pelo cliente do servidor. Mas há um problema, eu não sei o tamanho da string. Alguém me pode fazer um exemplo utilizando o realloc ou o malloc de como realocar mais memória?

É tipo assim:

 


result_3 = (char **)malloc(1024);
result_3 = obter_dados();   

O que eu queria era um exemplo de como agir se não couverem os dados no result_3

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponho que o melhor era passares o result_3 como parâmetro à obter_dados, e dentro desta ires lendo os dados até sizeof(result_3); se depois de chegares ao limite de result_3 ainda houverem dados para serem lidos, fazes um realloc do result_3 talvez para o dobro do sizeof, lias de novo os dados até ao limite de espaço do result_3, se houvessem mais dados fazias novo realloc, e por aí diante. Isto se não souberes à partida a quantidade total de dados a ler, porque se souberes simplifica muito!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, eu estou a fazer um trabalho em que tenho que lidar com strings recebidas pelo cliente do servidor. Mas há um problema, eu não sei o tamanho da string. Alguém me pode fazer um exemplo utilizando o realloc ou o malloc de como realocar mais memória?

É tipo assim:

 


result_3 = (char **)malloc(1024);
result_3 = obter_dados();   

O que eu queria era um exemplo de como agir se não couverem os dados no result_3

com os dados que deste sobre o problema é complicao dizer qual a melhor solução...

assumindo que a função 'obter_dados' devolve a string que queres armazenar em 'result_3', penso que a solução poderia ser

result_3=strdup(obter_dados());

o 'strdup' iria verificar o tamanho da string devolvida por 'obter_dados' a alocaria o espaço necessário para ela.

P.S. quando fazes result_3=obter_dados(); vais "deitar fora" o espaço que alocaste anteriormente. se querias copiar a string para o espaço alocado tinha que usar o 'strcpy'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas o problema é que esse código já foi gerado por um comando. É que estou a desenvolver uma aplicação em Sun RPC e ao executar um comando gera-me automaticamente o código, eu só tenho de o completar...

Vou testar e já digo alguma coisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o 'strdup' iria verificar o tamanho da string devolvida por 'obter_dados' a alocaria o espaço necessário para ela.

Mas não liberta o espaço que já esteja alocado e apontado por result_3...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora