Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penunjuk pintar C++: Jadikan penunjuk lebih pintar dan singkirkan masalah pengurusan memori

Penunjuk pintar C++: Jadikan penunjuk lebih pintar dan singkirkan masalah pengurusan memori

WBOY
WBOYasal
2024-05-09 17:12:01354semak imbas

Penunjuk pintar: penunjuk khas dalam C++ yang merangkum penuding mentah dan menyediakan fungsi tambahan. Jenis: std::unique_ptr: pemilikan unik, memori dikeluarkan selepas penunjuk tamat tempoh. std::shared_ptr: Pemilikan dikongsi, memori dikeluarkan apabila rujukan terakhir hilang. std::weak_ptr: Pemilikan yang lemah, tidak menghalang objek daripada dimusnahkan, dan mengelakkan rujukan bulat. Penggunaan: Isytiharkan jenis penunjuk pintar untuk menggantikan penunjuk biasa. Kes praktikal: Gunakan std::shared_ptr untuk mengurus strim fail dan menutup strim fail secara automatik tanpa mengira sama ada pengecualian berlaku.

C++ 智能指针:让指针更加智能,摆脱内存管理的烦恼

C++ Penunjuk Pintar: Jadikan penuding lebih bijak dan singkirkan kebimbangan pengurusan memori

Dalam C++ moden, penunjuk pintar ialah alat yang berkuasa untuk meningkatkan keteguhan aplikasi dan kecekapan pengurusan memori , dengan itu melindungi pembangun daripada potensi pepijat dan kebocoran memori.

Apakah penunjuk pintar?

Petunjuk pintar ialah penunjuk khas dalam C++ yang merangkum penunjuk mentah dan menyediakan fungsi tambahan, termasuk pelepasan memori automatik, keselamatan pengecualian dan pengurusan kiraan rujukan.

Jenis penunjuk pintar

Terdapat tiga jenis penunjuk pintar yang biasa digunakan dalam C++:

  • std::unique_ptr: Penuding pemilikan unik kepada satu objek. Penunjuk menjadi tidak sah selepas pemilikan dikeluarkan.
  • std::shared_ptr: Petunjuk pemilikan dikongsi ke objek. Objek dilepaskan apabila rujukan terakhir hilang.
  • std::weak_ptr: Petunjuk pemilikan lemah kepada objek. Tidak menghalang objek daripada dimusnahkan dan digunakan untuk mengelakkan rujukan bulat.

Cara menggunakan

Menggunakan penunjuk pintar adalah mudah, hanya isytiharkan jenis penunjuk pintar sebagai pengganti penunjuk biasa, seperti yang ditunjukkan di bawah:

// 使用 unique_ptr 管理一个 int
std::unique_ptr<int> number(new int(10));

// 使用 shared_ptr 管理一个 string
std::shared_ptr<std::string> text(new std::string("Hello world!"));

Kes praktikal

Pertimbangan berikut kami mahu Baca kandungan fail daripada fail melalui fungsi baca fail:

std::string readFile(const std::string& fileName) {
  std::ifstream file(fileName);

  // 检查文件是否打开
  if (!file.is_open()) {
    throw std::runtime_error("无法打开文件!");
  }

  // 读取文件内容到字符串中
  std::string content;
  file >> content;

  // 关闭文件
  file.close();

  // 返回文件内容
  return content;
}

Terdapat dua masalah utama dengan kod ini:

  1. Jika membuka fail gagal, pengecualian tidak dikendalikan dengan betul, yang boleh membawa kepada tingkah laku yang tidak dijangka.
  2. Panggilan file.close() yang bertanggungjawab untuk menutup fail perlu dilaksanakan dalam apa jua keadaan, walaupun pengecualian berlaku. file.close() 调用需要在任何情况下都执行,即使出现异常也不例外。

使用智能指针,我们可以轻松解决这些问题:

std::string readFile(const std::string& fileName) {
  // 使用 shared_ptr 管理文件流
  std::shared_ptr<std::ifstream> file(new std::ifstream(fileName));

  // 检查文件是否打开
  if (!*file) {
    throw std::runtime_error("无法打开文件!");
  }

  // 读取文件内容到字符串中
  std::string content;
  *file >> content;

  // 文件流将由 shared_ptr 自动关闭
  return content;
}

通过使用 std::shared_ptr

Menggunakan penunjuk pintar, kami boleh menyelesaikan masalah ini dengan mudah: 🎜rrreee🎜Dengan menggunakan std::shared_ptr, strim fail akan ditutup secara automatik tanpa mengira sama ada pengecualian berlaku. Selain itu, kod kini selamat mengendalikan kegagalan untuk membuka fail dan menyampaikannya kepada pemanggil melalui pengecualian. 🎜

Atas ialah kandungan terperinci Penunjuk pintar C++: Jadikan penunjuk lebih pintar dan singkirkan masalah pengurusan memori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn