Latest web development tutorials

memori dinamis C ++

Memahami memori dinamis di C ++ adalah bagaimana pekerjaan ini adalah untuk menjadi C berkualitas ++ programmer penting. C ++ memori program dibagi menjadi dua bagian:

  • Stack: semua variabel yang dideklarasikan di dalam fungsi akan mengambil memori stack.
  • Heap: Ini adalah program memori tidak digunakan, program berjalan dapat digunakan untuk secara dinamis mengalokasikan memori.

Banyak kali, Anda tidak dapat memprediksi di muka berapa banyak memori yang diperlukan untuk menyimpan variabel didefinisikan dalam informasi khusus yang diperlukan untuk menentukan ukuran memori yang diperlukan pada saat runtime.

Dalam C ++, Anda dapat menggunakan operator khusus ditugaskan untuk variabel dari jenis tertentu dari memori dalam tumpukan pada waktu berjalan, ia mengembalikan ruang alamat yang dialokasikan. Operator ini sedang operatorbaru.

Jika Anda tidak perlu untuk secara dinamis mengalokasikan memori, Anda dapat menggunakan operatordelete, terhapus oleh operator baru sebelum memori yang dialokasikan.

operator baru dan menghapus

Berikut adalah operator baru akan ada sintaks umum tipe data alokasi memori dinamis:

new data-type;

Di sini, data jenis dapat built-in tipe data, termasuk array, dapat menjadi semua jenis data termasuk kelas atau struktur, termasuk yang ditetapkan pengguna.Mari kita lihat tipe data built-in. Sebagai contoh, kita dapat mendefinisikan pointer ke pointer tipe ganda, kemudian meminta memori, memori dialokasikan pada jangka waktu. Kita dapat menggunakan operatorbaru sesuai dengan pernyataan berikut untuk mencapai hal ini:

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

Jika area penyimpanan gratis telah habis, mungkin tidak berhasil mengalokasikan memori. Dianjurkan untuk memeriksa apakah operator baru mengembalikan pointer NULL, dan mengambil tindakan yang tepat berikut:

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

}

malloc () fungsi dalam bahasa C muncul di C ++ masih ada, namun disarankan untuk tidak menggunakan malloc () fungsi.dan malloc () fungsi baru dibandingkan dengan keuntungan utama adalah bahwa, tidak hanya mengalokasikan memori baru, itu juga menciptakan objek.

Setiap saat, ketika Anda merasa bahwa dinamika variabel sudah dialokasikan memori tidak lagi diperlukan, Anda dapat menggunakan operator delete untuk melepaskan memori yang digunakan, sebagai berikut:

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

Digunakan dalam konsep di atas, contoh berikut menunjukkan bagaimana menggunakan baru dan menghapus operator:

#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;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Value of pvalue : 29495

Array alokasi memori dinamis

Misalkan kita ingin array karakter (string dari 20 karakter) untuk mengalokasikan memori, kita dapat menggunakan contoh di atas sintaks array untuk secara dinamis mengalokasikan memori, sebagai berikut:

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

Untuk menghapus sebuah array baru kita buat, pernyataan itu adalah sebagai berikut:

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

Berikut adalah sintaks umum operator baru dapat mengalokasikan memori untuk array multidimensi, sebagai berikut:

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

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

Melepaskan memori array multidimensi:

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

memori dinamis objek alokasi

objek tersebut tidak berbeda dari tipe data sederhana. Sebagai contoh, perhatikan kode berikut, kita akan menggunakan sebuah array dari objek untuk memperjelas konsep ini:

#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;
}

Jika Anda ingin Box yang berisi empat objek mengalokasikan array memori, konstruktor akan disebut empat kali, dengan cara yang sama, ketika Anda menghapus objek tersebut, destruktor akan disebut jumlah yang sama kali (empat kali).

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

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