Rumah Keuangan Pribadi Bagaimana Heap Works in C ++ - dummies

Bagaimana Heap Works in C ++ - dummies

Daftar Isi:

Video: Heap Sort | GeeksforGeeks 2024

Video: Heap Sort | GeeksforGeeks 2024
Anonim

Tumpukan adalah blok memori amorf yang dapat diakses oleh program C ++ Anda. Pelajari tentang mengapa hal itu ada dan bagaimana cara menggunakannya.

Sama seperti mungkin untuk melewatkan sebuah pointer ke sebuah fungsi, ada kemungkinan sebuah fungsi mengembalikan pointer. Fungsi yang mengembalikan alamat ganda dinyatakan sebagai berikut:

double * fn (void);

Namun, Anda harus sangat berhati-hati saat mengembalikan pointer. Untuk memahami bahaya, Anda harus tahu sesuatu tentang ruang lingkup variabel.

Lingkup terbatas di C ++

Ruang lingkup adalah rentang di mana variabel didefinisikan. Perhatikan cuplikan kode berikut:

// variabel berikut dapat diakses ke // semua fungsi dan didefinisikan selama // program berjalan (lingkup global) int intGlobal; // variabel intChild berikut dapat diakses // hanya untuk fungsi dan didefinisikan hanya // asalkan C ++ mengeksekusi fungsi child () atau // yang mana anak () memanggil (scope fungsi) void child (void) {int intChild;} // variabel berikut intParent memiliki fungsi // scope void parent (void) {int intParent = 0; anak(); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Fragmen program ini dimulai dengan deklarasi variabel intGlobal. Variabel ini ada sejak saat program mulai dijalankan sampai berakhir. Anda mengatakan bahwa intGlobal "memiliki cakupan program. "Anda juga mengatakan bahwa variabel" masuk ke lingkup "bahkan sebelum fungsi utama () dipanggil.

Fungsi utama () segera memanggil orang tua (). Hal pertama yang dilihat prosesor pada orang tua () adalah deklarasi intParent. Pada saat itu, intParent masuk ke dalam lingkup - yaitu, intParent didefinisikan dan tersedia untuk sisa fungsi induk ().

Pernyataan kedua pada orang tua () adalah panggilan untuk anak (). Sekali lagi, fungsi anak () mendeklarasikan variabel lokal, kali ini intChild. Ruang lingkup variabel intChild terbatas pada fungsi anak (). Secara teknis, intParent tidak didefinisikan dalam lingkup anak () karena anak () tidak memiliki akses ke intParent; Namun, variabel intParent terus ada saat anak () sedang mengeksekusi.

Saat anak () keluar, variabel intChild keluar dari ruang lingkup. Tidak hanya intChild yang tidak dapat diakses lagi, sudah tidak ada lagi. (Memori yang diduduki oleh intChild dikembalikan ke kolam umum untuk digunakan untuk hal-hal lain.)

Sebagai orang tua () terus mengeksekusi, variabel intLater masuk ke dalam lingkup deklarasi. Pada titik dimana parent () kembali ke main (), intParent dan intLater keluar dari ruang lingkup.

Karena intGlobal dinyatakan secara global dalam contoh ini, tersedia untuk ketiga fungsi dan tetap tersedia untuk kehidupan program.

Mengkaji masalah lingkup di C ++

Segmen kode berikut dikompilasi tanpa kesalahan namun tidak berhasil (bukankah Anda membenci itu?):

double * child (void) {double dLocalVariable; return & dLocalVariable;} void parent (void) {double * pdLocal; pdLocal = anak (); * pdLocal = 1. 0;}

Masalah dengan fungsi ini adalah bahwa dLocalVariable didefinisikan hanya dalam lingkup fungsi anak (). Jadi, pada saat alamat memori dLocalVariable dikembalikan dari anak (), ini mengacu pada variabel yang sudah tidak ada lagi. Ingatan yang sebelumnya diduduki dLocalVariable mungkin digunakan untuk hal lain.

Kesalahan ini sangat umum karena dapat merayap dalam beberapa cara. Sayangnya, kesalahan ini tidak menyebabkan program berhenti seketika. Sebenarnya, program ini bisa bekerja dengan baik hampir sepanjang waktu - yaitu, program terus berjalan selama memori yang sebelumnya diduduki oleh dLocalVariable tidak segera digunakan kembali. Masalah terputus-putus seperti itulah yang paling sulit dipecahkan.

Memberikan solusi menggunakan tumpukan di C + +

Masalah ruang lingkup berawal karena C ++ mengembalikan memori yang ditetapkan secara lokal sebelum pemrogram siap. Yang dibutuhkan adalah blok memori yang dikendalikan oleh programmer. Dia bisa mengalokasikan memori dan mengembalikannya saat dia ingin - bukan karena C ++ menganggap itu ide bagus. Seperti blok memori disebut tumpukan.

Memori tumpukan dialokasikan menggunakan kata kunci baru diikuti oleh jenis objek yang akan dialokasikan. Perintah baru memecahkan sepotong memori dari tumpukan yang cukup besar untuk menahan jenis objek yang ditentukan dan mengembalikan alamatnya. Sebagai contoh, berikut ini mengalokasikan variabel ganda dari tumpukan:

double * child (void) {double * pdLocalVariable = new double; return pdLocalVariable;}

Fungsi ini sekarang bekerja dengan baik. Meskipun variabel pdLocalVariable keluar dari ruang lingkup ketika fungsi anak () kembali, memori yang menjadi acuan pdLocalVariable tidak. Lokasi memori yang dikembalikan oleh yang baru tidak keluar dari ruang lingkup sampai secara eksplisit dikembalikan ke tumpukan dengan menggunakan kata kunci hapus, yang dirancang khusus untuk tujuan itu:

void parent (void) {// child () mengembalikan alamat dari satu blok // memori tumpukan ganda * pdMyDouble = child (); // simpan nilai di sana * pdMyDouble = 1. 1; // … // sekarang kembalikan memori ke tumpukan hapus pdMyDouble; pdMyDouble = 0; // …}

Disini pointer dikembalikan oleh anak () digunakan untuk menyimpan nilai ganda. Setelah fungsi selesai dengan lokasi memori, maka dikembalikan ke heap. Fungsi parent () mengatur pointer ke 0 setelah memori tumpukan telah dikembalikan - ini bukan persyaratan, tapi ini adalah ide yang sangat bagus.

Jika pemrogram secara keliru mencoba menyimpan sesuatu di * pdMyDouble setelah dihapus, program akan segera mogok dengan pesan kesalahan yang berarti.

Anda bisa menggunakan yang baru untuk mengalokasikan array dari heap juga, tapi Anda harus mengembalikan array menggunakan kata kunci delete []:

int * nArray = new int [10]; nArray [0] = 0; hapus [] nArray;

Secara teknis int baru [10] memanggil operator [] baru namun bekerja sama seperti yang baru.

Bagaimana Heap Works in C ++ - dummies

Pilihan Editor

Membuat Kartu Ucapan di Microsoft Word 2003 - dummies

Membuat Kartu Ucapan di Microsoft Word 2003 - dummies

Jika Anda ingin membuat sesuatu di Word yang hanya akan menyilaukan seseorang, coba tangan Anda dengan kartu ucapan yang disesuaikan. Untuk mengatur Word agar membuat kartu ucapan dari satu lembar kertas ukuran standar, ikuti langkah-langkah ini: 1. Pilih File -> Page Setup. 2. Klik tab Margins. 3. Pilih Landscape ...

Membuat Index of Word 2007 Document - dummies

Membuat Index of Word 2007 Document - dummies

Jika Anda ingin membuat indeks untuk Word Anda Dokumen 2007, tugas pertama adalah menandai kata atau frasa yang ingin Anda sertakan dalam indeks. Cara yang paling umum untuk melakukannya adalah dengan memasukkan penanda indeks dalam dokumen pada setiap kemunculan setiap item yang ingin Anda tampilkan ...

Editing di Word 2007: Melacak Perubahan dan Review - dummies

Editing di Word 2007: Melacak Perubahan dan Review - dummies

Menulis adalah seni yang sepi ... yaitu , sampai editor muncul. Mereka akan membuat revisi dengan menambahkan karya tulis Anda dengan hati-hati, memindahkan barang-barang, dan menghapus teks (Aduh!). Tidak ada cara untuk mengidentifikasi teks asli Anda dari teks yang dimodifikasi - kecuali jika Anda menggunakan alat Pelacakan Lagu Word 2007. Pelacakan perubahan sebagai ...

Pilihan Editor

Bagaimana Menonaktifkan dan Mengaktifkan Halaman di Squarespace - dummies

Bagaimana Menonaktifkan dan Mengaktifkan Halaman di Squarespace - dummies

Saat Anda melakukan pemeliharaan situs, kemungkinan besar Anda ingin menonaktifkan halaman situs Anda yang sedang dibangun. Squarespace memungkinkan Anda untuk dengan mudah menonaktifkan dan mengaktifkan kembali halaman. Bagaimana cara menonaktifkan halaman di Squarespace Jika Anda ingin menonaktifkan halaman di situs Anda, Anda dapat melakukannya di ...

Bagaimana Menentukan Navigasi Situs Anda di Squarespace - dummies

Bagaimana Menentukan Navigasi Situs Anda di Squarespace - dummies

Template yang Anda pilih di Squarespace mendikte berbagai area navigasi yang Anda miliki di situs Anda. Template Anda mungkin menyediakan area navigasi berikut di Pengelola Konten: Atas / Utama: Semua template memiliki navigasi teratas atau utama. Sekunder: Halaman yang ditambahkan ke area navigasi ini bukan fokus utama situs Anda. Footer: Beberapa template memiliki ...

Bagaimana Menemukan Editor Gaya Squarespace - dummies

Bagaimana Menemukan Editor Gaya Squarespace - dummies

Anda menggunakan Editor Gaya di Squarespace kapan saja Anda perlu memodifikasi desain situs Anda atau elemen tertentu di situs Anda. Style Editor adalah bagian dari mode Style, yang Anda akses di area Preview. Ikuti langkah-langkah ini untuk memuat Editor Gaya di browser Anda: Masuk ke situs web Anda. Anda ...

Pilihan Editor

Bagaimana Memodifikasi Master Slide di PowerPoint 2016 - dummies

Bagaimana Memodifikasi Master Slide di PowerPoint 2016 - dummies

Jika Anda tidak menyukai tata letak dari slide Anda dalam presentasi PowerPoint 2016, hubungi Master Slide dan lakukan sesuatu tentang hal itu, seperti yang ditunjukkan pada langkah-langkah ini: Buka Slide Master View dengan membuka tab View pada Ribbon dan kemudian klik tombol Slide Master, yang terdapat dalam Presentasi Grup tampilan Sebagai alternatif, ...

Bagaimana Memodifikasi Grafis SmartArt di PowerPoint - dummies

Bagaimana Memodifikasi Grafis SmartArt di PowerPoint - dummies

Setelah membuat grafik SmartArt dalam presentasi PowerPoint Anda, Anda mungkin ingin mengubahnya. Modifikasi dapat mencakup perubahan jenis atau tata letak grafis, menambah atau menghapus bentuk, dan mengubah urutan bentuk bentuk. Pada slide 1, klik bingkai grafis SmartArt untuk memilih keseluruhan grafik. Klik SmartArt Tools ...