Explicação detalhada dos fundamentos do gerenciamento dinâmico de memória

Índice

1. Por que existe alocação dinâmica de memória

2. Introdução às funções de memória dinâmica

2.1 malloc e grátis

Função:

Parâmetros e valores de retorno:

Precauções:

dica:

2,2 calloc

 2.3 função realoc

Função:

Parâmetros e valores de retorno:

Dois casos de realloc abrindo espaço

A realloc tomará as seguintes medidas para

Descrição: O valor de retorno de realloc pode ser aceito com o ponteiro original?

3. Erros comuns de memória dinâmica

3.1. Operação de desreferência no ponteiro NULL

3.2. Acesso fora dos limites ao espaço aberto dinâmico

3.3. Liberação livre de memória não alocada dinamicamente

3.4. Use free para liberar parte de uma memória alocada dinamicamente

3.5. Vários lançamentos da mesma memória dinâmica

3.6. Abra a memória dinamicamente e esqueça de liberar (vazamento de memória) o espaço aberto deve ser liberado


1. Por que existe alocação dinâmica de memória

Os métodos de desenvolvimento de memória que dominamos são:

int a = 0;
char b[10] = {0};

No entanto, a forma de abertura de espaço acima mencionada tem duas características:

  1. O tamanho do espaço aberto é fixo.
  2. Quando uma matriz é declarada, o comprimento da matriz deve ser especificado e a memória necessária é alocada no tempo de compilação.

Mas a demanda por espaço não é apenas a situação acima. Às vezes, o tamanho do espaço que precisamos é conhecido quando o programa está sendo executado .

A forma de abrir espaço ao compilar o array não é satisfatória.

Neste momento, apenas o desenvolvimento de memória dinâmica pode ser usado.

2. Introdução às funções de memória dinâmica

2.1 malloc e grátis

A linguagem C fornece uma função de desenvolvimento de memória dinâmica - malloc

Função:

Solicite um espaço disponível contínuo da memória e retorne um ponteiro para esse espaço.

Parâmetros e valores de retorno:

O parâmetro é um inteiro sem sinal em bytes e o valor de retorno é void*, que aponta para o ponteiro que abrimos neste espaço.

Precauções:
  • Se a alocação for bem-sucedida, um ponteiro para o espaço alocado será retornado.
  • Se a abertura falhar, um ponteiro NULL é retornado, então o valor de retorno da função malloc deve ser verificado !
  • O tipo do valor de retorno é void*, então a função malloc não conhece o tipo do espaço aberto, e o uso específico é determinado pelo usuário.
  • Se o tamanho do parâmetro for 0, o comportamento de malloc é indefinido pelo padrão.
dica:
  • Depois que malloc se aplica ao espaço, ele retorna diretamente o endereço inicial do espaço sem inicializar o conteúdo do espaço.
  • O espaço de memória solicitado pelo malloc é devolvido ao sistema operacional quando o programa é encerrado. Quando o programa não é encerrado, a memória dinamicamente irritada não será liberada ativamente e precisa ser liberada com a função livre .
  • Sempre que a função free libera o espaço, o ponteiro não tem conteúdo apontado. Para evitar ponteiros selvagens, ele precisa ser definido como controle (ou seja, após cada uso da função free, ele precisa ser definido como um ponteiro nulo )
  • A função livre não pode liberar espaço de memória não alocado dinamicamente, esse comportamento é indefinido pelo padrão
  • Se o parâmetro da função livre for um ponteiro nulo, a função livre não fará nada
int main()
{
	//int arr[10];
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	//开辟成功
	for (int i=0;i<10;i++)
	{
		printf("%d\n", *(p + 1));
	}
    free(p);
    p=NULL;
	return 0;
}

2,2 calloc

A linguagem C também disponibiliza uma função chamada calloc, que também é utilizada para alocação dinâmica de memória. O protótipo é o seguinte:

  •  A função da função é abrir um espaço para num elementos de tamanho size e inicializar cada byte do espaço como 0.
  • A única diferença da função malloc é que calloc irá inicializar cada byte do aplicativo para 0 antes de retornar o endereço

por exemplo:

 2.3 função realoc

Função:

O surgimento da função realloc torna o gerenciamento de memória dinâmica mais flexível e ajusta o tamanho da memória dinâmica.

Parâmetros e valores de retorno:

ptr é o endereço de memória a ser ajustado, size é o novo tamanho após o ajuste (em bytes) e o valor de retorno é a posição inicial da memória após o ajuste. Se ptr for um ponteiro nulo, a função da função será a mesma da função malloc.

Dois casos de realloc abrindo espaço

1. Há espaço suficiente atrás do espaço original

Retorne diretamente o endereço inicial do espaço original

2. Não há espaço suficiente atrás do espaço original

A realloc tomará as seguintes medidas para

(1) Abra um novo espaço

(2), os dados no antigo espaço serão copiados para o novo espaço

(3), libere o espaço antigo

(4), retorne o endereço inicial do novo espaço

Descrição: O valor de retorno de realloc pode ser aceito com o ponteiro original?

Resposta: Não, pois se o realloc falhar em aumentar a capacidade , ele retornará um ponteiro nulo, e o espaço apontado pelo ponteiro original não foi liberado, então ele será definido como um ponteiro nulo, o que causará um vazamento de memória ! Portanto, devemos usar um novo ponteiro para aceitá-lo e, em seguida, julgar se o aumento de capacidade foi bem-sucedido. Se for bem-sucedido, atribua o conteúdo do novo ponteiro ao ponteiro original, caso contrário, o programa será encerrado.

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		perror(malloc);
		return 1;
	}
	for (int i=0;i<2;i++)
	{
		*p = i + 1;
		p++;
		//p[i]=i+1;
	}
	int* ret = (int*)realloc(p, 80);
	if (ret == NULL)
	{
		perror(realloc);
		return 1;
	}
	p = ret;
	for (int i=0;i<20;i++)
	{
		printf("%d\n", p[i]);
	}
	free(p);
	p = NULL;
	return 0;
}

 A descrição acima é a maneira correta de usar o realloc para aumentar a capacidade. Se a capacidade for reduzida, insira diretamente um valor menor que o tamanho original.

3. Erros comuns de memória dinâmica

3.1. Operação de desreferência no ponteiro NULL

Solução: determine se o valor de retorno da função de alocação de memória malloc/calloc/realloc está vazio

3.2. Acesso fora dos limites ao espaço aberto dinâmico

3.3. Liberação livre de memória não alocada dinamicamente

3.4. Use free para liberar parte de uma memória alocada dinamicamente

Observe que p  neste momento não aponta para o endereço inicial do nosso espaço aberto dinâmico, mas é equivalente a uma parte da memória dinâmica. Neste momento, é errado usar free to release. Free release deve começar do início endereço da memória dinâmica !

Não permita que o ponteiro inicial se desvie! 

3.5. Vários lançamentos da mesma memória dinâmica

3.6. Abra a memória dinamicamente e esqueça de liberar (vazamento de memória) o espaço aberto deve ser liberado

Solução:

O espaço solicitado pela memória dinâmica não será destruído automaticamente quando sair do escopo, existem apenas duas maneiras de destruí-lo (devolver a memória ao sistema operacional): sair do programa e liberar a função.

As funções malloc e free são usadas em pares !

Acho que você gosta

Origin blog.csdn.net/hanwangyyds/article/details/131839879
Recomendado
Clasificación