Jump to content

[C++] Dúvida: Libertar Arrays


Krull
 Share

Recommended Posts

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.

Link to comment
Share on other 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).

Link to comment
Share on other 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  😛

Cumpr. bk@ero  😛

Link to comment
Share on other 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.

Link to comment
Share on other 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 :😛

Já agora, que experiências fizeste?

Desaparecido.

Link to comment
Share on other 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 :😛

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other 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

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

Link to comment
Share on other 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!

Desaparecido.

Link to comment
Share on other 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'.

Link to comment
Share on other 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...

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

Link to comment
Share on other sites

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
 Share

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