C++ Academy · Pelajaran

Mengapa Penuding Pintar Menggantikan new dan delete Mentah

Fahami RAII dan sebab pemilikan penuding mentah jarang betul dalam C++ moden.

Pelajaran 1 daripada 413 langkah

Mengapa Penuding Pintar Menggantikan new dan delete Mentah ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

new dan delete Mentah

Warisan C: new T memperuntukkan T pada timbunan; delete membebaskannya. Anda mesti memadankan setiap new dengan tepat satu delete — jika tidak, berlaku kebocoran atau ranap.

Widget* w = new Widget();
// ... use w ...
delete w;        // forget this and you leak

Perkara yang Boleh Berlaku

Kegagalan yang biasa berlaku:

  • delete terlupa — kebocoran memori
  • delete berganda — tingkah laku tidak ditakrifkan
  • Pengecualian dilemparkan antara new dengan delete — kebocoran
  • Memulangkan penuding mentah dengan pemilikan yang tidak jelas

RAII Menyelamatkan Keadaan

Pemerolehan Sumber ialah Inisialisasi: ikat jangka hayat sumber kepada jangka hayat objek timbunan. Pemusnah membebaskan sumber — walaupun pengecualian dilemparkan.

Idea Penuding Pintar

Penuding pintar ialah pembalut RAII kecil di sekeliling penuding mentah. Pemusnahnya memanggil delete. Anda tidak akan terlupa untuk membebaskannya.

Tiga Penuding Pintar

Penuding pintar pustaka standard dalam <memory>:

  • std::unique_ptr<T> — pemilikan eksklusif
  • std::shared_ptr<T> — pemilikan dikongsi dengan pengiraan rujukan
  • std::weak_ptr<T> — pemerhati tanpa pemilikan bagi shared_ptr

Penuding Pintar Tidak Membebankan

unique_ptr mempunyai overhed sifar (saiz dan kelajuan yang sama seperti penuding mentah). shared_ptr mempunyai kos kecil untuk pengiraan rujukan atom.

Tiada Lagi Delete Manual

Dengan penuding pintar, anda hampir tidak perlu menulis delete. Pemusnah akan menguruskannya.

#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyed

Penuding Pintar dan Pengecualian

Jika pengecualian dilemparkan di tengah-tengah fungsi, pemboleh ubah setempat dimusnahkan dalam susunan terbalik. Penuding pintar membebaskan sumbernya secara automatik — penuding mentah pula mengalami kebocoran.

Pemilikan dalam Jenis

Jenis penuding pintar kini mengekodkan pemilikan. Dengan membaca tandatangan fungsi, anda boleh mengetahui pihak yang memiliki objek itu.

// I take ownership
void consume(std::unique_ptr<Widget> w);

// I look but do not own
void inspect(const Widget& w);

Penuding Mentah Masih Wujud

Gunakan penuding mentah (atau rujukan) untuk akses tanpa pemilikan. Penuding ini menyampaikan maksud "Saya meminjam, bukan memiliki."

Menggantikan new dengan Fungsi make

Utamakan std::make_unique (C++14) dan std::make_shared (C++11). Kedua-duanya selamat daripada pengecualian dan sedikit lebih cekap berbanding memanggil new secara langsung.

auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");

Semakan Pantas

Apakah sebab utama menggunakan std::unique_ptr berbanding pasangan new/delete mentah?

Imbas Kembali

new/delete mentah mudah menyebabkan ralat. Penuding pintar membalut objek yang diperuntukkan pada timbunan dalam pemegang RAII yang membebaskannya secara automatik. Utamakan std::make_unique dan std::make_shared demi keselamatan dan prestasi.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Mengapa Penuding Pintar Menggantikan new dan delete Mentah” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Mengapa Penuding Pintar Menggantikan new dan delete Mentah”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengapa Penuding Pintar Menggantikan new dan delete Mentah”?

Fahami RAII dan sebab pemilikan penuding mentah jarang betul dalam C++ moden. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengapa Penuding Pintar Menggantikan new dan delete Mentah” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengapa Penuding Pintar Menggantikan new dan delete Mentah
  2. unique_ptr: Pemilikan Eksklusif
  3. shared_ptr dan weak_ptr: Pemilikan Dikongsi
  4. Penghapus Tersuai dan Fungsi Make
← Kembali ke C++ Academy