Gerenciamento de memória: exemplos
Este artigo descreve como o MFC executa alocações de quadro e alocações de heap para cada um dos três tipos típicos de alocação de memória:
Uma matriz de bytes
Uma estrutura de dados
Um objeto
Alocação de uma matriz de bytes
Para alocar uma matriz de bytes no quadro
Define a matriz como mostra o código a seguir. A matriz é automaticamente excluída e sua memória são recuperadas quando a variável de matriz sai do escopo.
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
Para alocar uma matriz de bytes (ou de qualquer tipo de dados primitivo) no heap
Use o operador de new com a sintaxe da matriz mostrada neste exemplo:
const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
Para desalocar as matrizes de heap
Use o operador de delete como segue:
delete [] myCharArray; delete [] myIntArray;
Alocação de uma estrutura de dados
Para atribuir uma estrutura de dados no quadro
Defina a variável da estrutura como segue:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
A memória ocupada pela estrutura são recuperadas quando sai do escopo.
Para atribuir estruturas de dados no heap
Use new para atribuir estruturas de dados no heap e em delete para desalocar-los, como mostram os exemplos a seguir:
// Heap allocation MyStructType* myStruct = new MyStructType; // Use the struct through the pointer ... myStruct->topScore = 297; delete myStruct;
Alocação de um objeto
Para atribuir um objeto no quadro
Declare o objeto como segue:
{ CMyClass myClass; // Automatic constructor call here myClass.SomeMemberFunction(); // Use the object }
O destruidor para o objeto é invocado automaticamente quando o objeto é encerrado seu escopo.
Para atribuir um objeto no heap
Use o operador de new , que retorna um ponteiro para o objeto, atribuir objetos no heap. Use o operador de delete para excluí-los.
Os exemplos do heap e do quadro presumem que o construtor de CPerson não utiliza argumentos.
// Automatic constructor call here CMyClass* myClass = new CMyClass; myClass->SomeMemberFunction(); // Use the object delete myClass; // Destructor invoked during delete
Se o argumento para o construtor de CPerson é um ponteiro para char, a instrução para alocação do quadro é:
CMyClass myClass("Joe Smith");
A instrução da alocação de heap é:
CMyClass* myClass = new CMyClass("Joe Smith");