Função free(), alocação de memória, etc..

Função free(), alocação de memória, etc..

por Bruno Sesso -
Número de respostas: 1

1) Gostaria de saber como a função free() sabe a quantidade de memória a ser liberada, já que ao alocá-la com o malloc(), precisamos dizer quanto deve ser utilizado.

2) É possível saber se parte da memória esta sendo alocada ou não? 

3) Aproveitando o assunto gostaria de entender um pouco melhor como funciona a alocação de memória; quem gerência a memória é o sistema? Ele quem indica onde pode ser feita a alocação e se a memória pode ser usada? 

Em resposta à Bruno Sesso

Re: Função free(), alocação de memória, etc..

por Caio Braz -

Boas perguntas, vamos lá!

Quando a função malloc é chamada, é passado um tamanho (em bytes), e ela devolve um bloco de memória contíguo daquele tamanho ou NULL caso não seja possível alocar um bloco destes. Isto vai ser importante logo mais.

Toda vez que um processo faz uma chamada para malloc (entre outras), embaixo dos panos é feita uma coisa chamada "System Call", isto é, uma chamada a código do Kernel do SO. (Se isso não ficar claro, tudo bem, estou dando spoilers de MAC-0422 aqui). mostrando a língua

O importante é saber que quem decide se é possível ou não e sendo possível, qual pedaço da memória será "dado" ao processo é única e exclusivamente o S.O., que dá uma permissão para o processo usar aquela região.

Assim sendo, cada processo sabe quais blocos de memória são "seus". Essencialmente uma SegFault é uma tentiva de acesso a um bloco de memória no qual o processo não tem permissão para mexer.

Quanto à função free, ela recebe um endereço de um bloco contíguo de memória e novamente faz uma "System Call", informando ao S.O. que aquele espaço está disponível para ele novamente. O S.O. por sua vez, sabe qual era o tamanho do bloco dado, então todo o bloco que começava no endereço passado à função free está livre. sorriso

 

Acabei me empolgando um pouco na resposta, mas espero ter ajudado a entender um pouco melhor o que acontece.

Se ficou alguma dúvida (ou criou alguma nova), só postar aqui!