智能指针

  1. 智能指针分类: std::unique_ptr, std::shared_ptr, std::weak_ptr.使用它们需要包含头文件
  2. C++11 新增了 std::make_shared() 方法创建一个 std::shared_ptr 对象,却没有提供相应的 std::make_unique() 方法创建一个 std::unique_ptr 对象,这个方法直到 C++14 才被添加进来.
  3. std::unique_ptr 是独占所有权的智能指针, 确保同一时间只能有一个 unique_ptr指向对象. 不能进行拷贝操作,但是可以通过移动操作将所有权转移给其它指针.
  4. std::shared_ptr 允许多个指针共享同一个对象的所有权,通过引用计数来管理共享资源,当最后一个指向该对象的指针被销毁时,对象会被自动释放.
  5. std::weak_ptr 是一种弱引用的智能指针, 不拥有对象的所有权, 不会影响对象的生命周期,通常用于解决循环引用问题.配合 std::shared_ptr 的使用,解决循环引用的问题.
  6. std::auto_ptr 是C++98标准引入的智能指针, 也实现了对对象的独占所有权, 但在复制操作时会移动资源.在C++11中被废弃.

指针与引用的区别

特性 指针 引用
声明 int* p; int& ref = a;
初始化 可不初始化,默认为野指针 必须初始化
使用时访问变量值 需要解引用 *p 直接使用 ref
重新赋值 指针可以指向不同地址 引用一旦绑定不可更改
空指针 可以指向空(nullptr 引用不能为“空”,必须绑定有效对象
  • 指针 指针是一个变量,存储的是另一个变量的内存地址。指针可以指向任何数据类型,包括基本类型、对象、函数等。实质是存储地址的变量,占用内存空间(通常是4或8字节,依赖于系统架构)。
  • 引用 引用是某个变量的别名,是已存在变量的一个别称。引用必须在定义时初始化,且一旦绑定到某个变量,就不能再绑定到其它变量。引用通常被实现为指针的常量别名,编译器在生成代码时会优化为直接访问目标变量,引用本身不占用额外空间。
+ 指针与引用代码示例
#include <iostream>

void incrementPointer(int* p) {
    if (p) {
        (*p)++;
    }
}

void incrementReference(int& r) {
    r++;
}

int main() {
    int a = 5;

    incrementPointer(&a);
    std::cout << "After incrementPointer: " << a << std::endl;  // 输出6

    incrementReference(a);
    std::cout << "After incrementReference: " << a << std::endl; // 输出7

    return 0;
}

函数指针

参考链接

  1. 透彻理解C++11 移动语义:右值、右值引用、std::move、std::forward
  2. 详解c++中的智能指针
  3. 智能指针与内存管理)
  4. 万字长文系统梳理一下C++函数指针
  5. C++ 函数指针 & 类成员函数指针
  6. C++指针难点梳理