Rumah Kewangan Peribadi Bagaimana kerja-kerja Heap di C ++ - dummies

Bagaimana kerja-kerja Heap di C ++ - dummies

Isi kandungan:

Video: Heap Sort | GeeksforGeeks 2024

Video: Heap Sort | GeeksforGeeks 2024
Anonim

Tumpukan itu adalah blok ingatan amorf yang dapat diakses oleh program C ++ anda. Ketahui mengapa ia wujud dan cara menggunakannya.

Seperti yang mungkin untuk lulus penuding ke fungsi, mungkin fungsi berfungsi untuk mengembalikan penunjuk. Fungsi yang mengembalikan alamat ganda didik sebagai berikut:

double * fn (void);

Walau bagaimanapun, anda mesti berhati-hati ketika kembali penunjuk. Untuk memahami bahaya, anda mesti tahu sesuatu tentang skop yang berubah-ubah.

Skop terhad dalam C ++

Skop adalah julat yang mana pembolehubah ditakrifkan. Pertimbangkan coretan kod berikut:

// pembolehubah berikut boleh diakses // semua fungsi dan ditakrifkan selagi program // berjalan (skop global) int intGlobal; // int18 yang berubah-ubah berikut boleh diakses // hanya untuk fungsi dan ditakrifkan // selama C ++ sedang melaksanakan anak () atau fungsi // yang kanak-kanak () panggilan (ruang lingkup fungsi) tidak sah anak (tidak sah) {int intChild;} // pembolehubah berikut intParent mempunyai fungsi // skop batal ibu bapa (tidak sah) {int intParent = 0; kanak (); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Fragmen program ini bermula dengan pengisytiharan variable intGlobal. Pembolehubah ini wujud dari masa program dijalankan sehingga tamat. Anda mengatakan bahawa intGlobal "mempunyai skop program. "Anda juga mengatakan bahawa pembolehubah" masuk ke dalam skop "sebelum fungsi utama () dipanggil.

Fungsi utama () segera memanggil ibu bapa (). Perkara pertama yang diproses oleh pemproses di ibu bapa () ialah pengisytiharan intParent. Pada ketika itu, intParent masuk ke dalam skop - iaitu, intParent ditakrifkan dan tersedia untuk baki ibu bapa fungsi ().

Pernyataan kedua dalam induk () adalah panggilan kepada anak (). Sekali lagi, kanak-kanak fungsi () mengisytiharkan pembolehubah setempat, kali ini intChild. Skop intChild pembolehubah dihadkan kepada fungsi kanak-kanak (). Secara teknikal, intParent tidak ditakrifkan dalam skop kanak-kanak () kerana kanak-kanak () tidak mempunyai akses kepada intParent; Walau bagaimanapun, intParent pembolehubah terus wujud sementara anak () sedang melaksanakan.

Apabila kanak-kanak () keluar, intChild yang berubah-ubah keluar daripada skop. Bukan sahaja intChild tidak dapat diakses lagi, ia tidak lagi wujud. (Memori yang diduduki oleh intChild dikembalikan ke kolam umum untuk digunakan untuk perkara lain.)

Sebagai ibu bapa () terus melaksanakan, intLater pembolehubah masuk ke ruang lingkup perisytiharan. Pada titik bahawa ibu bapa () kembali ke utama (), kedua-dua intParent dan intLater keluar daripada skop.

Oleh kerana intGlobal diisytiharkan secara global dalam contoh ini, ia boleh didapati untuk ketiga-tiga fungsi dan masih tersedia untuk hayat program.

Memeriksa masalah skop di C ++

Segmen kod berikut dikompil tanpa ralat tetapi tidak berfungsi (tidakkah anda benci?):

double * child (void) {double dLocalVariable; kembali & dLocalVariable;} batal ibu bapa (tidak sah) {double * pdLocal; pdLocal = child (); * pdLocal = 1. 0;}

Masalah dengan fungsi ini adalah bahawa dLocalVariable ditakrifkan hanya dalam skop fungsi kanak-kanak (). Oleh itu, pada masa alamat memori dLocalVariable dikembalikan dari anak (), ia merujuk kepada pembolehubah yang tidak lagi wujud. Ingatan yang dlocalVariable yang dahulu diduduki mungkin digunakan untuk sesuatu yang lain.

Kesilapan ini sangat biasa kerana ia boleh merayap dalam beberapa cara. Malangnya, ralat ini tidak menyebabkan program berhenti seketika. Malah, program ini boleh berfungsi dengan baik sepanjang masa - iaitu program terus berfungsi selagi memori yang dahulu diduduki oleh dLocalVariable tidak lagi digunakan semula. Masalah seketika sedemikian adalah yang paling sukar untuk diselesaikan.

Menyediakan penyelesaian menggunakan timbunan dalam C ++

Masalah skop berasal kerana C ++ telah mengembalikan memori yang ditetapkan secara setempat sebelum programmer telah siap. Apa yang diperlukan ialah blok ingatan yang dikawal oleh programmer. Dia boleh memperuntukkan memori dan meletakkannya kembali apabila dia mahu - bukan kerana C ++ fikir ia adalah idea yang baik. Blok memori sedemikian dipanggil timbunan.

Memori timbunan diperuntukkan menggunakan kata kunci baru yang diikuti oleh jenis objek untuk diperuntukkan. Perintah baru memecahkan sekeping memori dari timbunan yang cukup besar untuk memegang jenis objek yang ditentukan dan mengembalikan alamatnya. Sebagai contoh, berikut memperuntukkan pembolehubah berganda di luar timbunan:

kanak-kanak * double (tidak sah) {double * pdLocalVariable = double baru; kembali pdLocalVariable;}

Fungsi ini sekarang berfungsi dengan betul. Walaupun pembolehubah pdLocalVariable keluar dari ruang lingkup apabila fungsi kanak-kanak () kembali, ingatan yang tidak dapat dirujuk oleh pdLocalVariable. Lokasi memori yang dikembalikan oleh yang baru tidak keluar daripada ruang lingkup sehingga ia dikembalikan secara eksplisit ke timbunan menggunakan kata kunci padam, yang direka khusus untuk maksud itu:

ketua kosong (kosong) {// child () mengembalikan alamat dari blok // dari memori tumpukan ganda * pdMyDouble = anak (); // menyimpan nilai di sana * pdMyDouble = 1. 1; // … // sekarang pulihkan ingatan kepada timbunan memadam pdMyDouble; pdMyDouble = 0; // …}

Di sini penunjuk yang dikembalikan oleh anak () digunakan untuk menyimpan nilai berganda. Selepas fungsi selesai dengan lokasi memori, ia akan dikembalikan ke timbunan. Fungsi ibu bapa () menetapkan penunjuk kepada 0 selepas memori tumpukan telah dikembalikan - ini bukan keperluan, tetapi ia adalah idea yang sangat baik.

Jika programmer tersilap cuba menyimpan sesuatu dalam * pdMyDouble selepas pemadaman, program tersebut akan segera crash dengan mesej ralat yang bermakna.

Anda boleh menggunakan baru untuk memperuntukkan tatasusunan dari timbunan juga, tetapi anda mesti mengembalikan array menggunakan kata kunci memadamkan []:

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

Secara teknis baru int [10] memanggil pengendali baru [] tetapi ia berfungsi sama seperti yang baru.

Bagaimana kerja-kerja Heap di C ++ - dummies

Pilihan Editor

QuickBooks 2016: Senarai Kod Cukai Jualan, Senarai Kelas dan Senarai Nama Lain -

QuickBooks 2016: Senarai Kod Cukai Jualan, Senarai Kelas dan Senarai Nama Lain -

QuickBooks 2016 menawarkan banyak senarai. Anda mungkin ingin melihat senarai Kod Cukai Jualan, senarai Kelas, dan senarai Nama Lain. Jika anda perlu melihat senarai ini, cuma pilih senarai dari menu Senarai atau pilih Daftar → Senarai Profil Pelanggan & Vendor dan pilih senarai dari submenu yang ...

Perubahan Tarikh cepat - dummies

Perubahan Tarikh cepat - dummies

Ingin memasukkan atau menukar tarikh dalam entri QuickBooks? Memasuki dan mengedit tarikh dalam QuickBooks adalah pantas dan mudah apabila anda menggunakan pintasan keyboard QuickBooks yang sangat berguna ini. QuickBooks Key atau Keystroke Combination Shortcut Results + Next day - Hari Sebelumnya T Hari W Hari Pertama Minggu K Hari terakhir ...

QuickBooks Mematuhi Pesanan Pembelian - dummies

QuickBooks Mematuhi Pesanan Pembelian - dummies

Anda boleh membuat PO QuickBooks walaupun anda memesan barang melalui telefon atau melalui World Wide Web - iaitu, apabila anda tidak meminta barangan secara bertulis. Mengisi pesanan pembelian membolehkan anda menentukan item yang ada pada pesanan dan apabila item tersebut akan tiba. Apa yang anda perlu lakukan ialah bertanya ...

Pilihan Editor

Buat Label dengan Grafik di Word 2016 - dummies

Buat Label dengan Grafik di Word 2016 - dummies

Kata membolehkan anda mencetak helaian label yang serupa, tetapi ia mengandungi hanya teks membosankan. Cuba rempah-rempah dengan menambah warna, fancy, dan pemformatan. Cara terbaik untuk memasak label ialah menambah gambar atau grafik lain. Ikuti langkah berikut: Klik tab Mailings. Dalam kumpulan Buat, klik ...

Cara Mencipta Blok Bangunan AutoTeks dalam Kata 2016 - dummies

Cara Mencipta Blok Bangunan AutoTeks dalam Kata 2016 - dummies

Kata 2016 tidak mempunyai fungsi AutoComplete . Ia telah dikeluarkan beberapa versi yang lalu. Di tempatnya, anda membuat blok bangunan AutoText, yang berfungsi seperti AutoComplete lama. Blok bangunan AutoText ialah pembantu menaip. Anda membuat blok bangunan untuk teks yang sering anda taip, seperti nama, alamat, permintaan maaf, dan sebagainya. ...

Membuat Kad Ucapan di Microsoft Word 2003 - dummies

Membuat Kad Ucapan di Microsoft Word 2003 - dummies

Jika anda ingin membuat sesuatu dalam Word yang hanya akan mempesonakan seseorang, cuba tangan anda pada kad ucapan tersuai. Untuk menyiapkan Word untuk membuat kad ucapan dari satu lembaran kertas bersaiz standard, ikuti langkah-langkah berikut: 1. Pilih Fail -> Persediaan Halaman. 2. Klik tab Margin. 3. Pilih Landskap ...

Pilihan Editor

Cara Menyediakan Pengawal Cari untuk Geocoding dalam App iOS Anda

Cara Menyediakan Pengawal Cari untuk Geocoding dalam App iOS Anda

Anda sudah mempunyai satu teka-teki geocoding di tempat di papan cerita anda untuk apl iOS anda; ini Pengawal Cari yang sesuai bernama. Caranya ialah untuk menambah pengawal peribadi yang akan melaksanakan ciri Cari yang anda mahu. Untuk menambah projek anda, ikuti langkah-langkah berikut: Dalam Navigator Projek, pilih ...

Cara Menyediakan Pengawal Peta di Main_iPad. Storyboard dalam Apl IOS anda - dummies

Cara Menyediakan Pengawal Peta di Main_iPad. Storyboard dalam Apl IOS anda - dummies

Sekali anda mempunyai pengawal paparan peribadi untuk MapController dalam aplikasi iOS anda, anda perlu memberitahu papan cerita iPad untuk memuat pengawal pandangan adat anda dan bukannya UIViewController. Ikuti langkah berikut: Dalam Navigator Projek, pilih Main_iPad. papan cerita dan kemudian pilih Lihat Pengawal di Lihat Pengawal - Adegan Peta dalam Garis Besar Dokumen. ...