C++中的智能指针(smart pointer)

简介: C++中的智能指针(smart pointer)

智能指针是一种特殊的指针,它能够自动管理动态内存。使用智能指针可以避免内存泄漏等问题,提高代码的健壮性。

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. 第1行引入iostream头文件,第2行引入memory头文件。

  2. 第4至11行定义了一个名为MyClass的类,其中包含一个构造函数、一个析构函数和一个成员函数doSomething()。

  3. 在第13至19行的main函数中,通过new关键字创建一个MyClass对象,并用std::shared_ptr包装,得到一个名为ptr1的智能指针。

  4. 然后将ptr1赋值给ptr2,此时有两个智能指针指向同一个对象。

  5. 第21至22行输出智能指针的引用计数。

  6. 第24至25行通过箭头运算符访问MyClass对象的成员函数doSomething()。

  7. 第27至28行通过解引用运算符访问MyClass对象的成员函数doSomething()。

  8. 第30行使用reset()方法释放ptr1中指向的MyClass对象。

  9. 第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

以上就是智能指针的基本用法,需要注意的是,在使用智能指针的过程中不要出现循环引用,否则会导致内存泄漏。

相关文章
|
18天前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
21 1
|
18天前
|
数据采集 存储 编译器
this指针如何使C++成员指针可调用
本文介绍了C++中的this指针,它是一个隐藏的指针,用于在成员函数中访问对象实例的成员。文章通过代码示例阐述了this指针的工作原理,以及如何使用指向成员变量和成员函数的指针。此外,还提供了一个多线程爬虫示例,展示this指针如何使成员指针在对象实例上调用,同时利用代理IP和多线程提升爬取效率。
this指针如何使C++成员指针可调用
|
5天前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
32 5
|
4天前
|
C++ 容器
【编程技巧】 C++11智能指针
C++11引入了智能指针以自动管理内存,防止内存泄漏和悬挂指针: - `shared_ptr`:引用计数,多所有权,适用于多个对象共享资源。 - `unique_ptr`:独占所有权,更轻量级,适用于单一对象所有者。 - `weak_ptr`:弱引用,不增加引用计数,解决`shared_ptr`循环引用问题。 ## shared_ptr - 支持引用计数,所有者共同负责资源释放。 - 创建方式:空指针、new操作、拷贝构造/移动构造,以及自定义删除器。 - 提供`operator*`和`operator-&gt;`,以及`reset`、`swap`等方法。 ## unique_ptr
|
6天前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
4天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
7 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
6天前
|
设计模式 C++ 开发者
C++一分钟之-智能指针:unique_ptr与shared_ptr
【6月更文挑战第24天】C++智能指针`unique_ptr`和`shared_ptr`管理内存,防止泄漏。`unique_ptr`独占资源,离开作用域自动释放;`shared_ptr`通过引用计数共享所有权,最后一个副本销毁时释放资源。常见问题包括`unique_ptr`复制、`shared_ptr`循环引用和裸指针转换。避免这些问题需使用移动语义、`weak_ptr`和明智转换裸指针。示例展示了如何使用它们管理资源。正确使用能提升代码安全性和效率。
14 2
|
11天前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
26 3
|
16天前
|
编译器 Linux C++
C++智能指针
**C++智能指针是RAII技术的体现,用于自动管理动态内存,防止内存泄漏。主要有三种类型:已废弃的std::auto_ptr、不可复制的std::unique_ptr和可共享的std::shared_ptr。std::unique_ptr通过禁止拷贝和赋值确保唯一所有权,而std::shared_ptr使用引用计数来协调多个指针对同一资源的共享。在C++17中,std::auto_ptr因设计缺陷被移除。**
|
23天前
|
存储 编译器 C++
C++中的指针
C++中的指针
12 1