Krull Posted November 3, 2006 at 01:32 PM Report Share #61850 Posted November 3, 2006 at 01:32 PM 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 More sharing options...
Rui Carlos Posted November 3, 2006 at 08:43 PM Report Share #61952 Posted November 3, 2006 at 08:43 PM 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). Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
brink@ero Posted November 3, 2006 at 10:29 PM Report Share #61983 Posted November 3, 2006 at 10:29 PM 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 More sharing options...
Krull Posted November 4, 2006 at 12:36 AM Author Report Share #61997 Posted November 4, 2006 at 12:36 AM Obrigado, vou exprimentar 😛 Link to comment Share on other sites More sharing options...
TheDark Posted November 4, 2006 at 04:41 AM Report Share #62009 Posted November 4, 2006 at 04:41 AM Mas isto é C++ -> operador new! malloc e afins é C. Desaparecido. Link to comment Share on other sites More sharing options...
Hipnoted Posted November 4, 2006 at 09:16 AM Report Share #62014 Posted November 4, 2006 at 09:16 AM 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" Link to comment Share on other sites More sharing options...
TheDark Posted November 4, 2006 at 01:44 PM Report Share #62047 Posted November 4, 2006 at 01:44 PM Mas se estamos em C++ e o new é nativo, para quê estar a utilizar bibliotecas extra...? Desaparecido. Link to comment Share on other sites More sharing options...
Rui Carlos Posted November 4, 2006 at 01:57 PM Report Share #62050 Posted November 4, 2006 at 01:57 PM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted November 4, 2006 at 02:26 PM Report Share #62057 Posted November 4, 2006 at 02:26 PM 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 More sharing options...
Rui Carlos Posted November 4, 2006 at 02:30 PM Report Share #62058 Posted November 4, 2006 at 02:30 PM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted November 4, 2006 at 03:28 PM Report Share #62067 Posted November 4, 2006 at 03:28 PM 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 More sharing options...
Rui Carlos Posted November 4, 2006 at 03:56 PM Report Share #62073 Posted November 4, 2006 at 03:56 PM [...]Supostamente, o malloc deve funcionar assim[...] 'realloc' querias tu dizer, certo? :dontgetit: Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
TheDark Posted November 4, 2006 at 04:25 PM Report Share #62076 Posted November 4, 2006 at 04:25 PM Pois ? já alterei, tankiu 😄 Desaparecido. Link to comment Share on other sites More sharing options...
Hipnoted Posted November 5, 2006 at 02:53 AM Report Share #62160 Posted November 5, 2006 at 02:53 AM 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 More sharing options...
TheDark Posted November 5, 2006 at 03:41 AM Report Share #62163 Posted November 5, 2006 at 03:41 AM 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 More sharing options...
Rui Carlos Posted November 5, 2006 at 09:24 AM Report Share #62167 Posted November 5, 2006 at 09:24 AM 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'. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Hipnoted Posted November 5, 2006 at 10:13 AM Report Share #62172 Posted November 5, 2006 at 10:13 AM 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 More sharing options...
TheDark Posted November 5, 2006 at 04:26 PM Report Share #62222 Posted November 5, 2006 at 04:26 PM 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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now