Peruntukan Memori Dinamik dalam C++

Peruntukan Memori Dinamik Dalam C



Biasanya, semasa menggunakan kod sumber dalam bahasa pengaturcaraan C++, pengkompil memperuntukkan memori secara manual kepada pembolehubah untuk penyimpanan data. Ia dikatakan sebagai peruntukan memori statik. Ini adalah ingatan tetap yang tidak boleh diubah setelah diisytiharkan. Untuk jenis peruntukan memori ini, sistem pengendalian menggunakan tindanan untuk menyimpan data. Dalam peruntukan statik, memori diperuntukkan sebelum kod sumber mula dilaksanakan.

Manakala, dalam peruntukan memori dinamik, memori diperuntukkan semasa pelaksanaan telah bermula. Memori ini diperuntukkan secara manual oleh pengaturcara pada masa jalan, juga dikenali sebagai peruntukan memori masa jalan dalam C++. Saiz memori dinamik boleh ditukar pada mana-mana kedudukan dalam program kerana pada masa pengisytiharan, kami tidak menyebut saiz yang boleh diperbaiki. Kami hanya memberikan nilai terus kepada pembolehubah.

Perbezaan peruntukan memori kepada pembolehubah normal

Dalam pembolehubah biasa, memori yang diperuntukkan oleh pengkompil diperuntukkan dan diagihkan secara automatik. Apabila memori diperuntukkan secara dinamik oleh pengaturcara, dia kemudiannya perlu mengeluarkan atau mengagihkan memori apabila ia tidak berguna dalam pelaksanaan selanjutnya kod sumber. Keadaan ini menyebabkan 'kebocoran memori' apabila program ditamatkan sementara memori tidak diagihkan.







Operator untuk peruntukan dinamik

Dalam C++, dua operator membantu dalam peruntukan memori dan deallocation: 'baru' dan 'padam' yang digunakan untuk peruntukan dan deallocation memori dengan cara yang lebih baik.



Operator baharu

Ia menandakan permintaan untuk peruntukan memori. Operator baharu memulakan memori dan mengembalikan alamat memori yang diperuntukkan itu kepada pembolehubah penunjuk jika terdapat cukup memori.



Objek penunjuk = baru data - menaip ;

Padam operator

Sama seperti pengendali baharu, pengendali padam digunakan untuk mengalih keluar memori yang diperuntukkan. Dalam C++, pengaturcara boleh menggunakan operator ini untuk deallocation.





# Padam pembolehubah_penunjuk;

Contoh 1

Dalam contoh ini, kami akan memperkenalkan dua penunjuk: satu ialah penunjuk jenis integer dan satu lagi ialah penunjuk apungan. Penunjuk dimulakan dengan menggunakan tanda asterisk dengannya.

# Int * pointInt;
# Terapung *pointfloat;

Dengan menggunakan kedua-dua pencetak ini, kami akan memperuntukkan memori secara dinamik.



Peranan penunjuk dalam peruntukan dinamik:
Memori ruang storan dibangunkan dalam bentuk blok. Setiap kali kita melaksanakan program atau melakukan sebarang operasi, memori diperuntukkan untuk tujuan khusus tersebut. Memori itu mempunyai alamat khas yang dikaitkan dengan atur cara yang mengenal pasti proses atau atur cara yang dibenarkan untuk ingatan itu. Mana-mana slot memori diakses melalui alamat tempat ia berada. Jadi alamat ini disimpan melalui penunjuk. Ringkasnya, kita memerlukan penunjuk untuk mengakses memori dan dengan cara yang sama, untuk memperuntukkan bahagian tertentu memori untuk sebarang tugas. Penunjuk diperlukan untuk menyimpan alamat.

Oleh kerana kata kunci 'baru' digunakan untuk peruntukan dinamik memori dalam peruntukan manual, memori diperuntukkan oleh pengkompil. Kita tidak perlu memperuntukkan memori pada masa larian. Tetapi kerana peruntukan dinamik adalah rawak, kita perlu mengenal pasti petunjuk dan untuk proses mengikat, pengendali baharu ini digunakan.

# Pointint = int baharu;

Begitu juga, penunjuk terapung diikat begitu juga. Selepas proses pengikatan, kami akan menetapkan sebarang nilai pada memori yang ingin kami tempah untuk sebarang operasi. Dengan mengisytiharkan penunjuk, kami menetapkan nilai tertentu kepada memori.

# *pointInt = 50;

Nilai apungan untuk apungan titik juga diisytiharkan. Paparkan nilai selepas diberikan.

Seperti yang telah kita bincangkan, pengendali 'baru' digunakan untuk memperuntukkan manakala 'memadam' digunakan untuk mengagihkan memori. Oleh itu, sebaik sahaja anda menyelesaikan tugas atau operasi dalam kod, kami akan mengalih keluar memori yang telah kami peruntukkan untuk tugas itu.

Adalah lebih baik untuk mengagihkan bahagian memori itu supaya sebarang proses lain boleh memanfaatkannya. Kami akan menggunakan peruntukan ini pada kedua-dua petunjuk.

Padamkan titik terapung ;

Sebaik sahaja anda menyimpan kod pada editor teks, terminal Ubuntu membenarkan anda melaksanakan kod sumber di dalam fail melalui pengkompil g++.

$ g++ -o mem mem.c
$ ./mem

Selepas pelaksanaan, anda akan melihat nilai yang diberikan kepada memori.

Contoh 2

Contoh ini mempunyai penglibatan interaksi pengguna. Kami akan mengambil pembolehubah nombor yang akan mengandungi nilai daripada pengguna. Program ini akan menyimpan keputusan dalam GPA pelajar. Semua hasil akan disimpan pada masa larian.

Apabila pengguna memasukkan bilangan pelajar, memori diperuntukkan terhadap setiap nombor. Penunjuk jenis apungan dimulakan di sini yang akan digunakan dalam peruntukan memori hasil.

Kami mengambil penunjuk dalam apungan kerana GPA adalah dalam tatatanda perpuluhan. Kami mengambil tatasusunan jenis penunjuk untuk GPA kerana ia boleh menghasilkan beberapa pelajar.

Ptr = baru terapung [ pada satu ]

Tatasusunan penunjuk dengan kata kunci 'baru' ini akan mengikat pelaksanaan dengan memori. GPA akan dimasukkan untuk setiap pelajar. Memandangkan kami tidak biasa dengan bilangan pelajar yang ingin ditambahkan oleh pengguna, kami menggunakan gelung for untuk memasukkan GPA sehingga nombor yang dimasukkan. Dalam setiap ulangan gelung, pengguna diminta untuk memasukkan keputusan yang mengenal pasti pelajar. Setelah keputusan disimpan, kami sekali lagi akan menggunakan gelung untuk memaparkan semua GPA pelajar. Pada akhirnya, tatasusunan jenis penunjuk dipadamkan, kerana tujuan storan dinamik telah dicapai.

Padam [ ] ptr ;

Sekarang kita akan melaksanakan kod yang disebutkan di atas. Pengguna akan terlebih dahulu diminta untuk memasukkan bilangan pelajar. Kemudian GPA untuk setiap pelajar akan dimasukkan.

Contoh 3

Contoh ini menggunakan operator baharu dan padam untuk objek kelas. Kelas ini mengandungi pembolehubah peribadi jenis integer yang menyimpan umur. Di bahagian awam kelas, pembina dicipta yang akan memulakan umur kepada nombor '10'. Fungsi lain digunakan di sini yang akan memaparkan umur yang dimulakan dalam pembina.

Sekarang kita akan pergi ke arah program utama untuk peruntukan dinamik. Objek kelas dibuat secara dinamik.

Pelajar * ptr = baru pelajar ( ) ;

Apabila objek dibentuk, pembina akan dilaksanakan secara automatik. Panggilan fungsi akan dibuat untuk mendapatkan umur. Ini akan dilakukan melalui ptr.

Ptr - > getAge ( ) ;

Dan pada akhirnya, ingatan akan dilepaskan.

Kesimpulan

Peruntukan memori dinamik diperuntukkan pada pelaksanaan masa larian oleh pengaturcara dan bukannya storan tetap yang dikenal pasti oleh pengkompil. Peruntukan ini adalah secara rawak dan boleh dihapuskan selepas ia digunakan. Manakala, dalam kebanyakan kes, sebelum penyingkiran, proses pelaksanaan berhenti dan peruntukan dinamik ini kemudian menyebabkan kebocoran memori. Kami telah melaksanakan fenomena ini dalam pendekatan yang berbeza dalam sistem Linux Ubuntu menggunakan bahasa pengaturcaraan C++.