Jump to content

[C++] Dúvida: Libertar Arrays


Recommended Posts

Posted

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 😛 acho que devia ir para duvidas.

Posted

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).

Posted

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  😛

Cumpr. bk@ero  😛

Posted

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

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

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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.

Posted

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 :😛

Já agora, que experiências fizeste?

Desaparecido.

Posted

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 :😛

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.

Posted

Certo, só me lembrei disso enquanto almoçava (que foi há 10 minutos :😛 ). 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 😛

Desaparecido.

Posted

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

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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!

Desaparecido.

Posted

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'.

Posted

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...

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

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...

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.