New dan Delete

Dalam bahas C++, kalian bisa menggunakan alokasi dengan malloc dan free yang dimiliki bahasa C. Tapi, ada baiknya kalian menggunakan fitur khusus C++ untuk alokasi memori. Dalam bahasa C++, ada operator new dan delete yang bisa kalian gunakan untuk alokasi memori. 

Sintaks new :

  • Variabel_pointer = new constructor_object;
  • Variabel_pointer = new tipe_data_array[jumlah_data];
  • Variabel_pointer = new nama_class [jumlah_object];

Keuntungan penggunaan new dan delete yaitu, ini bisa digunakan untuk object. Kalian juga tidak memerlukan sizeof untuk menentukan ukuran alokasi memori. Ukuran memori yang dialokasikan juga ditentukan berdasarkan ukuran variabelnya.

#include <iostream>

using namespace std;

class kelasku{
 public:
     int var1, var2;
     kelasku(int v1, int v2){
      var1=v1;
      var2=v2;
     };
    ~kelasku(){
        cout << endl << "selesai";
    }
     int tampilkan(){
      cout << "var1 : " << var1 << endl;
      cout << "var2 : " << var2;
     }
};

int main(){
 kelasku *objekku=new kelasku(3, 2);
 objekku->tampilkan();
 delete objekku;
}
Output :
var1 : 3
var2 : 2
selesai

Contoh di atas mengalokasikan memori untuk objek baru dengan memberikan nilai pada konstruktor classnya. Object langsung disalin alamatnya ke variabel objekku yang bertipe pointer dari object. Objek baru tersebut bisa diakses membernya dengan operator "->" karena disimpan dalam pointer. Setelah objek tidak digunakan, memori yang digunakan dibersihkan dengan delete sehingga objek tidak bisa dipakai lagi.

Isi constructor dipanggil saat object dibuat dengan new. Saat object dihapus dengan delete, gantian isi destructor yang langsung dieksekusi.

Mengalokasikan Memori untuk Array

Selain untuk object, operator new juga bisa digunakan untuk membuat array yang ukurannya ditentukan saat program berjalan.

#include <iostream>

using namespace std;

#define jdata 10

int main(){
  int *arr=new int[jdata];
  for(int i=0;i<jdata;i++)arr[i]=i+2;
  cout << "data :" << endl;
  for(int i=0;i<jdata;i++)cout << arr[i] << endl;
  delete[] arr;
}
Output :
data :
2
3
4
5
6
7
8
9
10
11

Setelah dialokasikan memorinya sesuai banyaknya data yang diinginkan, kalian bisa menyimpan alamat array dalam pointer. Array dianggap sama dengan pointer yang menunjuk awal dari rangkaian data. Kalian bisa menggunakan indeksnya seperti halnya array karena indeks array mirip dengan pergeseran pointer. Penghapusan atau dealokasi memori array perlu operator [] di antara delete dan nama variabel.

Contoh Penerapan Alokasi Memori untuk Queue

Alokasi memori akan cukup berguna untuk membuat linked list dari nol. Mungkin, kalian ingin mempelajarinya walaupun sekarang sudah ada STL. Sebagai contohnya, kita akan coba membuat program untuk menampilkan queue.

#include <iostream>

using namespace std;

struct dataku{
    string nama;
    string alamat;
    dataku *setelahnya;
};

struct info_data {
    dataku *depan;
    dataku *belakang;
    dataku data[10];
};

void tampilkan_data(info_data *info){
    dataku *tdata=info->depan;
    while(tdata!=NULL){
    	cout << tdata->nama << endl;
    	tdata=tdata->setelahnya;
    }
}

void push_data(info_data *info, char *s){
    dataku *tmp=new dataku;
    tmp->setelahnya=NULL;
    tmp->nama=s;
    
    if(info->depan!=NULL){
        info->belakang->setelahnya=tmp;
    }else{
        info->depan=tmp;
    }
    info->belakang=tmp;
}

void pop_data(info_data *info){
    dataku *pdata=info->depan;
    info->depan=pdata->setelahnya;
    delete pdata;
}

int main(){
    info_data info;
    dataku *dt=info.data;
    //inisiasi info_data
    info.depan=NULL;
    info.belakang=NULL;
    
    //push data
    push_data(&info, "Sani");
    push_data(&info, "Geri");
    push_data(&info, "Toni");
    push_data(&info, "Tono");
    push_data(&info, "Tino");

    //hapus data
    pop_data(&info);
    //tampilkan data
    tampilkan_data(&info);

    return 0;
}
Output :
Geri
Toni
Tono
Tino

Kalian perlu berhati-hati saat membuat program dengan linked list karena rentan error saat alokasi dan pembersihan memori. Kalau tidak yakin, lebih baik gunakan library seperti STL saja. Kalau kalian sudah yakin dengan ketelitian kalian, kalian bisa mencoba membuat linked list jenis lain.