Introdução ao gerenciamento de memória C++ | Revisão de malloc, realloc, calloc em C | Distribuição de memória | Gerenciamento de memória | nova exclusão | operador novo | exclusão de operador

Índice

1. Distribuição de memória C/C++

1. Divisão da área de memória do programa em C/C++

2. Gerenciamento dinâmico de memória em linguagem C

1.malloc/calloc/realloc/livre

3. Gerenciamento dinâmico de memória em C++

1. tipo integrado de operação de nova/exclusão

2. Operações de nova e exclusão em tipos personalizados

4. Funções de operador novo e exclusão de operador

1.operador novo e funções de exclusão de operador

5. Princípios de implementação de novo e exclusão

1. Tipos integrados

2. Tipo personalizado

A diferença entre malloc/free e new/delete

Resumir


1. Distribuição de memória C/C++

1. Divisão da área de memória do programa em C/C++

Na memória, a memória é dividida em diferentes áreas para facilitar o gerenciamento do sistema operacional, sendo dividida principalmente nas seguintes partes:

  • Espaço do kernel (o código do usuário não pode ler ou escrever)
  • Pilha (crescendo para baixo): Também chamada de pilha, armazena variáveis ​​locais não estáticas, parâmetros de função, valores de retorno, etc.
  • Segmento de mapeamento de memória: É um método eficiente de mapeamento IO, usado para carregar uma biblioteca de memória dinâmica compartilhada.Os usuários podem usar a interface do sistema para criar memória compartilhada para comunicação entre processos.
  • Heap (crescendo para cima): usado para alocação dinâmica de memória enquanto o programa está em execução. O valor de mallo/realloc... está na pilha
  • Segmento de dados (também chamado de área estática): armazena variáveis ​​globais e variáveis ​​estáticas
  • Segmento de código (área constante): armazena código executável/constantes somente leitura

 Onde está char2 ? variáveis ​​locais na pilha      

* Onde está char2 ? O nome do array é o endereço do primeiro elemento, char2 aponta para o endereço de a, *char2 aponta para a, na pilha
Onde está  pChar3 ? variáveis ​​locais na pilha     
* Onde está pChar3 ? Aponta para uma constante de caractere, no segmento de código (área constante)
Onde está    ptr1 ? variáveis ​​locais, na pilha
* Onde está ptr1 ? Aponta para o valor de mallo, na pilha

2. Gerenciamento dinâmico de memória em linguagem C

1.malloc/calloc/realloc/livre

void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);
// 1.malloc/calloc/realloc的区别是什么?
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
// 这里需要free(p2)吗?  不需要
free(p3 );
}
  • malloc: Abre o tamanho de bytes de memória. Se a alocação for bem-sucedida, retornará o endereço inicial desta memória. Se falhar, retornará um ponteiro nulo. O endereço inicial retornado é do tipo void *.

  •  calloc: Abra um endereço de bytes do tipo num* e inicialize-o como 0. Se size for 0, o valor de retorno depende da biblioteca específica (não tenho certeza se é um ponteiro nulo), mas o ponteiro retornado não pode ser desreferenciado. Se o desenvolvimento for bem-sucedido, o endereço inicial será retornado e o tipo será void*. Se o desenvolvimento falhar, um ponteiro nulo será retornado.

 

  • realloc: Altera o tamanho do bloco de memória apontado por ptr. A função move o bloco de memória para um novo local e retém o menor dos dois tamanhos originais. Se ptr for um ponteiro nulo, a função é igual a malloc.

3. Gerenciamento dinâmico de memória em C++

1. tipo integrado de operação de nova/exclusão

void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  
  // 动态申请一个int类型的空间并初始化为10
  int* ptr5 = new int(10);
  
  // 动态申请10个int类型的空间
  int* ptr6 = new int[10];
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}

Para solicitar e liberar espaço para um único elemento, use os operadores new e delete. Para solicitar e liberar espaço contínuo, use new[] e delete[]. Observe que os operadores devem corresponder

2. Operações de nova e exclusão em tipos personalizados

class A
{
public:
  //构造
 A(int a = 0)
 : _a(a)
 {
     cout << "A():" << this << endl;
  }

//注:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与
free不会。

 ~A()
 {
 cout << "~A():" << this << endl;
 }
private:
 int _a;
};
int main()
{
 // new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
还会调用构造函数和析构函数
 A* p1 = (A*)malloc(sizeof(A));
 A* p2 = new A(1);
 free(p1);
 delete p2;
 // 内置类型是几乎是一样的
 int* p3 = (int*)malloc(sizeof(int)); // C
 int* p4 = new int;
free(p3);
delete p4;
 A* p5 = (A*)malloc(sizeof(A)*10);
 A* p6 = new A[10];
 free(p5);
 delete[] p6;
 return 0;
}

4. Funções de operador novo e exclusão de operador

1.operador novo e funções de exclusão de operador

new e delete são os operadores para os usuários solicitarem e liberarem memória dinâmica . O operador new e o operador delete são
A função global fornecida pelo sistema new chama o operador new global function na parte inferior para solicitar espaço e delete usa a função global delete do operador na parte inferior para liberar espaço.
O operador new realmente solicita espaço por meio de malloc . Se malloc solicitar espaço com sucesso, ele retornará diretamente. Caso contrário, ele implementará as medidas de resposta de espaço insuficiente fornecidas pelo usuário. Se o usuário fornecer essa medida, ela continuará a ser aplicada, caso contrário, isso lançará uma exceção. A exclusão do operador finalmente libera espaço por meio de free .

5. Princípios de implementação de novo e exclusão

1. Tipos integrados

Se você estiver solicitando um tipo de espaço integrado, new e malloc , delete e free são basicamente semelhantes.
A diferença é:
new/delete se aplica e libera o espaço de um único elemento, new[] e delete[] se aplicam ao espaço contínuo e new lançará uma exceção quando não conseguir solicitar espaço e malloc retornará NULL .

2. Tipo personalizado

  • O princípio do novo

    1. Ligue para a nova operadora para solicitar espaço

    2. Execute o construtor no espaço solicitado para concluir a construção do objeto

  • princípio de exclusão

    1. Execute o destruidor no espaço para concluir a limpeza dos recursos do objeto

    2. Chame a função delete do operador para liberar o espaço do objeto

  •     Princípio do novo T[N]
    1. Chame a função do operador new[] e, na verdade, chame a função do operador new no operador new[] para completar a aplicação para N espaços de objetos .
    2. Execute o construtor N vezes no espaço solicitado
  • O princípio da exclusão[]
   1. Execute N destruidores no espaço de objetos liberado para concluir a limpeza de recursos em N objetos.
   2. Chame o operador delete[] para liberar espaço. Na verdade, o operador delete é chamado no operador delete[] para liberar espaço.
Abrir espaço

A diferença entre malloc/free e new/delete

O que malloc/free e new/delete têm em comum é que ambos solicitam espaço do heap e exigem que o usuário o libere manualmente. As diferenças são respondidas a partir dos dois aspectos a seguir: uso e princípios subjacentes.

1. Uso

  • 1. malloc e free são funções, new e delete são operadores
  • 2. O espaço solicitado pelo malloc não será inicializado, mas um novo pode ser inicializado.
  • 3. Quando malloc se aplica ao espaço, você precisa calcular manualmente o tamanho do espaço e passá-lo. New só precisa ser seguido pelo tipo de espaço. Se houver vários objetos, basta especificar o número de objetos em [] .
  • 4. O valor de retorno de malloc é void*, que deve ser forçado quando usado. New não é necessário porque new é seguido pelo tipo de espaço.

2. Princípios subjacentes

  • Quando malloc não solicita espaço, ele retorna NULL , portanto deve ser nulo quando usado. New não precisa, mas new requer
Para capturar exceção
  •  Ao solicitar um objeto de tipo personalizado, malloc/free apenas abrirá espaço e não chamará o construtor e o destruidor. New chamará o construtor para completar a inicialização do objeto após solicitar espaço, e delete chamará o destruidor antes de liberar o espaço. Conclua a limpeza de recursos no espaço

Resumir

Este capítulo resume principalmente a distribuição de memória em C/C++, bem como o uso de funções malloc, realloc, calloc e operadores new/delete.

Acho que você gosta

Origin blog.csdn.net/jolly0514/article/details/131740626
Recomendado
Clasificación