智能指针是一种特殊的指针,它能够自动管理动态内存。使用智能指针可以避免内存泄漏等问题,提高代码的健壮性。
C++11引入了两种智能指针:std::unique_ptr和std::shared_ptr。其中std::unique_ptr只能有一个智能指针引用,而std::shared_ptr可以有多个智能指针引用。
接下来,我将用一个示例程序来介绍如何使用std::shared_ptr。
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass Constructor" << std::endl; }
~MyClass() { std::cout << "MyClass Destructor" << std::endl; }
void doSomething() { std::cout << "doSomething" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1(new MyClass);
std::shared_ptr<MyClass> ptr2 = ptr1;
std::cout << "ptr1 use count: " << ptr1.use_count() << std::endl; // 输出2,即有两个智能指针指向同一个对象
std::cout << "ptr2 use count: " << ptr2.use_count() << std::endl;
ptr1->doSomething(); // 使用箭头运算符访问MyClass的成员函数
(*ptr2).doSomething(); // 使用解引用运算符访问MyClass的成员函数
ptr1.reset(); // ptr1释放指针所指向的对象
std::cout << "ptr1 use count: " << ptr1.use_count() << std::endl; // 输出0
std::cout << "ptr2 use count: " << ptr2.use_count() << std::endl; // 输出1
return 0;
}
代码解释:
第1行引入iostream头文件,第2行引入memory头文件。
第4至11行定义了一个名为MyClass的类,其中包含一个构造函数、一个析构函数和一个成员函数doSomething()。
在第13至19行的main函数中,通过new关键字创建一个MyClass对象,并用std::shared_ptr包装,得到一个名为ptr1的智能指针。
然后将ptr1赋值给ptr2,此时有两个智能指针指向同一个对象。
第21至22行输出智能指针的引用计数。
第24至25行通过箭头运算符访问MyClass对象的成员函数doSomething()。
第27至28行通过解引用运算符访问MyClass对象的成员函数doSomething()。
第30行使用reset()方法释放ptr1中指向的MyClass对象。
第32至33行再次输出智能指针的引用计数,可以看到只有ptr2还在引用MyClass对象,而ptr1已经不再引用。
输出结果:
MyClass Constructor
ptr1 use count: 2
ptr2 use count: 2
doSomething
doSomething
MyClass Destructor
ptr1 use count: 0
ptr2 use count: 1
以上就是智能指针的基本用法,需要注意的是,在使用智能指针的过程中不要出现循环引用,否则会导致内存泄漏。