Gerenciamento de memória C ++: novo e excluir

Neste tutorial, aprenderemos a gerenciar a memória de forma eficaz em C ++ usando operações new e delete com a ajuda de exemplos.

C ++ nos permite alocar a memória de uma variável ou array em tempo de execução. Isso é conhecido como alocação de memória dinâmica.

Em outras linguagens de programação, como Java e Python, o compilador gerencia automaticamente as memórias alocadas às variáveis. Mas este não é o caso em C ++.

Em C ++, precisamos desalocar manualmente a memória alocada dinamicamente após não termos uso para a variável.

Podemos alocar e desalocar memória dinamicamente usando os operadores newe deleterespectivamente.

C ++ novo operador

O newoperador aloca memória para uma variável. Por exemplo,

 // declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;

Aqui, alocamos memória dinamicamente para uma intvariável usando o newoperador.

Observe que usamos o ponteiro pointVar para alocar a memória dinamicamente. Isso ocorre porque o newoperador retorna o endereço do local da memória.

No caso de uma matriz, o newoperador retorna o endereço do primeiro elemento da matriz.

No exemplo acima, podemos ver que a sintaxe para usar o newoperador é

 pointerVariable = new dataType;

excluir operador

Uma vez que não precisamos mais usar uma variável que declaramos dinamicamente, podemos desalocar a memória ocupada pela variável.

Para isso, o deleteoperador é usado. Ele retorna a memória para o sistema operacional. Isso é conhecido como desalocação de memória .

A sintaxe para este operador é

 delete pointerVariable;

Considere o código:

 // declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;

Aqui, alocamos memória dinamicamente para uma intvariável usando o ponteiro pointVar.

Depois de imprimir o conteúdo de pointVar, desalocamos a memória usando delete.

Nota : Se o programa usa uma grande quantidade de memória indesejada usando new, o sistema pode travar porque não haverá memória disponível para o sistema operacional. Neste caso, o deleteoperador pode ajudar o sistema a travar.

Exemplo 1: Alocação de memória dinâmica C ++

 #include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )

Resultado

 45 45,45

Neste programa, alocamos memória dinamicamente para duas variáveis ​​de tipos inte float. Depois de atribuir valores a eles e imprimi-los, finalmente desalocamos as memórias usando o código

 delete pointInt, pointFloat;

Nota: A alocação de memória dinâmica pode tornar o gerenciamento de memória mais eficiente.

Principalmente para arrays, onde muitas vezes não sabemos o tamanho do array até o tempo de execução.

Exemplo 2: C ++ new e delete Operator for Arrays

 // C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )

Resultado

Insira o número total de alunos: 4 Insira o GPA de alunos. Aluno1: 3,6 Aluno2: 3,1 Aluno3: 3,9 Aluno4: 2,9 Exibindo GPA dos alunos. Aluno1: 3,6 Aluno2: 3,1 Aluno3: 3,9 Aluno4: 2,9

Neste programa, pedimos ao usuário para inserir o número de alunos e armazená-lo na variável num.

Então, alocamos a memória dinamicamente para o floatarray usando new.

Nós inserimos os dados no array (e depois os imprimimos) usando a notação de ponteiro.

Depois que não precisamos mais do array, desalocamos a memória do array usando o código delete () ptr;.

Observe o uso de ()after delete. Usamos os colchetes ()para denotar que a desalocação de memória é a de um array.

Exemplo 3: C ++ new e delete Operator for Objects

 #include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age 

Output

 Age = 12

In this program, we have created a Student class that has a private variable age.

We have initialized age to 12 in the default constructor Student() and print its value with the function getAge().

In main(), we have created a Student object using the new operator and use the pointer ptr to point to its address.

The moment the object is created, the Student() constructor initializes age to 12.

We then call the getAge() function using the code:

 ptr->getAge();

Notice the arrow operator ->. This operator is used to access class members using pointers.

Artigos interessantes...