// C++11 标准引入了 `std::shared_ptr`,它是智能指针的一种实现,用于管理资源,特别是在堆上分配的内存。
// `shared_ptr` 类型的指针,可以将指针的管理(包括内存资源的占有和占有数量的计数)委托给其他的指针。
// `shared_ptr` 使用引用计数的方式,以确保在没有引用指向所管理的内存时,自动释放该内存。
#include <iostream>
#include <memory>
class MyClass
{
public:
MyClass() {
std::cout << "MyClass created" << std::endl;
}
~MyClass() {
std::cout << "MyClass destoryed" << std::endl;
}
void DoSomething() {
std::cout << "Do something" << std::endl;
}
};
int main()
{
std::shared_ptr<MyClass> ptr1(new MyClass); // ptr1托管一个MyClass对象,引用技术初始值为1
std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2也托管MyClass对象,现在引用计数为2
std::cout << "The reference count is " << ptr1.use_count() << std::endl; // 显示该对象的引用计数
ptr1->DoSomething(); // 通过ptr1访问对象
(*ptr1).DoSomething();
ptr2->DoSomething(); // 通过ptr1访问对象
(*ptr2).DoSomething();
ptr2.reset(); // 释放ptr2的引用,引用计数-1,现在引用计数为1
std::cout << "The reference count is " << ptr1.use_count() << std::endl;
ptr1.reset(); // 释放ptr1的引用,引用计数减一,现在引用计数为0,MyClass对象被自动销毁
// 注意:
// `ptr1` 是一个指向对象的智能指针,它重载了 `operator->` 和 `operator*` 运算符。
// 当使用 `->` 运算符时,实际上是在访问被指向的对象指针的成员函数或成员变量。
// 当使用 `.` 运算符时,实际上是先调用 `operator*` 运算符获取指向的对象,然后再访问该对象的成员函数或成员变量。
// 因此,在上面的示例中,`ptr1` 可以使用 `->` 运算符来直接访问 `MyClass` 对象的成员函数 `doSomething()`。
// 例如,可以使用 `ptr1->doSomething()` 来调用 `doSomething()` 函数,因为 `ptr1` 实际是指向 `MyClass` 对象的指针。
// 也可以使用 `(*ptr1).doSomething()` 这样的语法来访问 `doSomething()` 函数,
// 这种方式会先将智能指针解引用为原始指针类型,然后访问该指针指向的对象的成员函数
return 0;
}
c++智能指针std::shared_ptr
最新推荐文章于 2024-08-30 21:23:55 发布