Í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
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
A diferença entre malloc/free e new/delete
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 pilhaOnde 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ãoA 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.