Latest web development tutorials

C ++ динамическая память

Понимание динамической памяти в C ++ это как работа должна стать квалифицированным C ++ программисты существенные. Память программ C ++, разделена на две части:

  • Стек: все переменные , объявленные внутри функции будет занимать память стека.
  • Heap: Это программа памяти не используется, то запускается программа может быть использована для динамического распределения памяти.

Много раз, вы не можете предсказать заранее, сколько памяти требуется для хранения переменной, определенной в конкретной информации, необходимой для определения размера памяти, необходимой во время выполнения.

В C ++, вы можете использовать специальный оператор присваивается переменной данного типа памяти в куче во время выполнения, он возвращает адресное пространство, выделенное. Этот оператор являетсяновый оператор.

Если вам не нужно , чтобы динамически выделять память, вы можете использовать операторудаления, удален новым оператором перед выделенной памяти.

новые и удалять операторов

Вот новый оператор может быть любой общий синтаксис типа данных динамического распределения памяти:

new data-type;

Здесь данные типа могут быть любые встроенные типы данных, включая массивы, могут быть любого типа данных , в том числе класса или структуры, в том числе определяемые пользователем.Давайте сначала посмотрим на встроенные типы данных. Например, мы можем определить указатель на указатель типа двойной, затем запрашивает память, память выделяется во время выполнения. Мы можем использоватьновый оператор в соответствии со следующим утверждением , чтобы достичь этого:

double* pvalue  = NULL; // 初始化为 null 的指针
pvalue  = new double;   // 为变量请求内存

Если свободные зоны хранения были исчерпаны, он не может успешно выделить память. Желательно, чтобы проверить, возвращает ли новый оператор указатель NULL, и принять соответствующие меры следующим образом:

double* pvalue  = NULL;
if( !(pvalue  = new double ))
{
   cout << "Error: out of memory." <<endl;
   exit(1);

}

ФункциятаНос () в языке Си появился в C ++ по - прежнему присутствует, но рекомендуется не использовать таНос (функция).Новая функция и таНос () по сравнению с его основным преимуществом является то, что, не только выделить новую память, он также создал объект.

В любое время, когда вы чувствуете, что динамические переменные уже выделенной памяти больше не нужен, вы можете использовать оператор удаления, чтобы освободить память, которую он, следующим образом:

delete pvalue;        // 释放 pvalue 所指向的内存

Используется в приведенной выше концепции, в следующем примере показано, как использовать новые и удалять операторов:

#include <iostream>
using namespace std;

int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // 释放内存

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Value of pvalue : 29495

Массив динамического распределения памяти

Предположим, мы хотим, чтобы массив символов (строка из 20 символов) для выделения памяти, мы можем использовать приведенный выше пример синтаксиса массива для динамического распределения памяти, следующим образом:

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

Чтобы удалить массив, мы только что создали, заявление выглядит следующим образом:

delete [] pvalue;        // 删除 pvalue 所指向的数组

Вот общий синтаксис новый оператор может выделить память для многомерных массивов, следующим образом:

int ROW = 2;
int COL = 3;
double **pvalue  = new double* [ROW]; // 为行分配内存

// 为列分配内存
for(int i = 0; i < COL; i++) {
    pvalue[i] = new double[COL];
}

Отпустите многомерный массив памяти:

for(int i = 0; i < COL; i++) {
    delete[] pvalue[i];
}
delete [] pvalue; 

Объект динамического распределения памяти

Объект не отличается от простых типов данных. Например, рассмотрим следующий код, мы будем использовать массив объектов, чтобы уточнить эту концепцию:

#include <iostream>
using namespace std;

class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};

int main( )
{
   Box* myBoxArray = new Box[4];

   delete [] myBoxArray; // Delete array

   return 0;
}

Если вы хотите коробки содержит четыре объекта, выделить массив памяти, конструктор будет вызываться в четыре раза, таким же образом, при удалении этих объектов, деструктор будет называться такое же количество раз (четыре раза).

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!