Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Petunjuk pintar C++: Evolusi penunjuk, penyelesaian yang baik untuk masalah ingatan

Petunjuk pintar C++: Evolusi penunjuk, penyelesaian yang baik untuk masalah ingatan

WBOY
WBOYasal
2024-05-09 11:09:02355semak imbas

Petunjuk pintar ialah alat dalam C++ yang menyelesaikan masalah pengurusan memori dengan menguruskan pelepasan memori secara automatik. Jenis penunjuk pintar yang biasa digunakan ialah: unique_ptr: pemilikan eksklusif, melepaskan objek runcing apabila dimusnahkan. shared_ptr: Pemilikan dikongsi, pengiraan rujukan menjejaki bilangan penunjuk dan objek dilepaskan apabila penunjuk terakhir dimusnahkan. weak_ptr: Rujukan yang lemah tidak meningkatkan kitaran hayat objek dan hanya boleh digunakan dalam kombinasi dengan shared_ptr.

C++ 智能指针:指针的进化,解决内存问题的良药

C++ Penunjuk Pintar: Evolusi Penunjuk, Penyelesaian Baik untuk Masalah Ingatan

Penunjuk Pintar ialah alat berkuasa dalam C++ yang membantu menyelesaikan masalah seperti kebocoran memori dan penunjuk liar dengan menguruskan pelepasan memori secara automatik. Berbanding dengan petunjuk tradisional, penunjuk pintar adalah lebih selamat dan lebih cekap, membolehkan pengaturcara menumpukan pada menulis logik perniagaan tanpa perlu risau tentang butiran pengurusan memori yang membosankan.

Beberapa petunjuk pintar biasa

unique_ptr

  • pemilikan eksklusif, menunjuk kepada satu objek sahaja.
  • Apabila unique_ptr dimusnahkan, objek yang ditunjukkannya juga akan dimusnahkan.

shared_ptr

  • Pemilikan dikongsi, membenarkan berbilang objek menghala ke blok memori yang sama.
  • Kiraan rujukan menjejaki bilangan penunjuk Apabila share_ptr terakhir dimusnahkan, objek yang ditunjuk akan dimusnahkan.

weak_ptr

  • Rujukan yang lemah tidak akan meningkatkan kitaran hidup objek runcing.
  • Hanya boleh digunakan dalam kombinasi dengan shared_ptr Apabila shared_ptr terakhir dimusnahkan, weak_ptr akan menjadi tidak sah.

Kes praktikal

Andaikan kita mempunyai kelas Orang, yang mewakili seseorang. Matlamat kami adalah untuk mencipta vektor yang menyimpan objek Orang dan memastikan bahawa memori dilepaskan secara automatik apabila vektor keluar dari skop. Person 类,它表示一个人。我们的目标是创建一个存储 Person 对象的向量,并确保当向量超出了作用域时,内存会被自动释放。

#include <iostream>
#include <vector>
#include <memory>

class Person {
public:
    Person(const std::string& name) : name(name) {}
    ~Person() { std::cout << "Destructor called for " << name << std::endl; }

private:
    std::string name;
};

int main() {
    std::vector<std::shared_ptr<Person>> people;

    // 添加几个 Person 对象
    people.push_back(std::make_shared<Person>("John"));
    people.push_back(std::make_shared<Person>("Mary"));
    people.push_back(std::make_shared<Person>("Bob"));

    // 遍历并打印名称
    for (const auto& person : people) {
        std::cout << person->name << std::endl;
    }

    return 0;
}

输出:

John
Mary
Bob
Destructor called for John
Destructor called for Mary
Destructor called for Bob

在示例中,我们使用 std::shared_ptr8abf60ac54173a2785e603c7a1f95b4e 来存储 Person 对象的指针。当 people 向量超出作用域销毁时,智能指针也会随之销毁。这将自动释放 Personrrreee

Output: 🎜rrreee🎜Dalam contoh, kami menggunakan std::shared_ptr8abf60ac54173a2785e603c7a1f95b4e untuk menyimpan penunjuk objek Person. Apabila vektor orang dimusnahkan di luar skop, penunjuk pintar juga dimusnahkan. Ini secara automatik akan melepaskan memori yang diduduki oleh objek Orang dan mengelakkan kebocoran memori. 🎜

Atas ialah kandungan terperinci Petunjuk pintar C++: Evolusi penunjuk, penyelesaian yang baik untuk masalah ingatan. 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