legongju.com
我们一直在努力
2024-12-23 17:03 | 星期一

C++中如何进行智能指针的使用

在 C++ 中,智能指针是一种对象,它允许对原始指针进行更安全和更方便的操作。智能指针可以自动管理指向的对象的生命周期,当智能指针不再需要时,它会自动删除所指向的对象。

C++ 中常见的智能指针有 unique_ptrshared_ptrweak_ptr

  1. unique_ptr

unique_ptr 是一种独占所有权的智能指针,它保证同一时刻只有一个 unique_ptr 可以指向一个对象。当 unique_ptr 被销毁时(例如离开其作用域),它所指向的对象也会被自动删除。

示例代码:

#include 
#include 

struct Foo {
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
};

void func(std::unique_ptr ptr) {
    std::cout << "func: ptr.use_count() = " << ptr.use_count() << '\n';
}

int main() {
    std::unique_ptr ptr(new Foo);
    std::cout << "ptr.use_count() = " << ptr.use_count() << '\n';
    func(std::move(ptr));
    std::cout << "ptr.use_count() = " << ptr.use_count() << '\n';
    return 0;
}

输出结果:

Foo::Foo
func: ptr.use_count() = 2
Foo::~Foo
func: ptr.use_count() = 1
Foo::~Foo
  1. shared_ptr

shared_ptr 是一种共享所有权的智能指针,它允许多个 shared_ptr 对象共享同一个对象。shared_ptr 使用引用计数来跟踪指向同一个对象的 shared_ptr 对象数量。当最后一个指向对象的 shared_ptr 被销毁时,对象会被自动删除。

示例代码:

#include 
#include 

struct Foo {
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
};

void func(std::shared_ptr ptr) {
    std::cout << "func: ptr.use_count() = " << ptr.use_count() << '\n';
}

int main() {
    std::shared_ptr ptr1(new Foo);
    std::cout << "ptr1.use_count() = " << ptr1.use_count() << '\n';
    {
        std::shared_ptr ptr2 = ptr1;
        std::cout << "ptr1.use_count() = " << ptr1.use_count() << '\n';
        std::cout << "ptr2.use_count() = " << ptr2.use_count() << '\n';
    }
    std::cout << "ptr1.use_count() = " << ptr1.use_count() << '\n';
    func(ptr1);
    std::cout << "ptr1.use_count() = " << ptr1.use_count() << '\n';
    return 0;
}

输出结果:

Foo::Foo
ptr1.use_count() = 1
func: ptr1.use_count() = 2
Foo::~Foo
func: ptr1.use_count() = 1
Foo::~Foo
  1. weak_ptr

weak_ptr 是一种弱引用智能指针,它不拥有指向的对象,只是观察对象。weak_ptr 可以用来避免 shared_ptr 之间的循环引用问题。weak_ptr 可以升级为 shared_ptr,如果原 shared_ptr 仍然存在,则升级成功,否则升级为空 shared_ptr

示例代码:

#include 
#include 

struct Foo {
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
};

void func(std::weak_ptr wp) {
    if (auto sp = wp.lock()) {
        std::cout << "func: sp.use_count() = " << sp.use_count() << '\n';
    } else {
        std::cout << "func: wp has expired\n";
    }
}

int main() {
    std::shared_ptr ptr1(new Foo);
    std::weak_ptr wp = ptr1;
    func(wp);
    std::cout << "ptr1.use_count() = " << ptr1.use_count() << '\n';
    return 0;
}

输出结果:

Foo::Foo
func: sp.use_count() = 1
Foo::~Foo
ptr1.use_count() = 1

未经允许不得转载 » 本文链接:https://www.legongju.com/article/24762.html

相关推荐

  • c# configureawait 怎样与async/await配合

    c# configureawait 怎样与async/await配合

    ConfigureAwait(false) 和 async/await 是两个在 C# 中用于处理异步编程的技术。它们可以一起使用,以便在异步方法中更有效地控制上下文切换和线程调度。 async/...

  • c# configureawait 适用于哪些框架

    c# configureawait 适用于哪些框架

    ConfigureAwait(false) 是 C# 中用于异步编程的一个方法,它属于 System.Threading.Tasks 命名空间。ConfigureAwait 方法用于指示异步方法在哪个上下文中继续执行...

  • c# configureawait 怎么正确使用

    c# configureawait 怎么正确使用

    ConfigureAwait(false) 是 C# 中用于控制异步操作上下文的一个方法。它告诉编译器和运行时不要尝试将当前任务与调用线程的上下文绑定在一起。这在某些情况下非常...

  • c# configureawait 是什么含义

    c# configureawait 是什么含义

    ConfigureAwait(false) 是 C# 中用于异步编程的一个方法。它属于 System.Threading.Tasks 命名空间下的 Task 类。ConfigureAwait 方法用于指示异步方法在哪个上下...

  • Python如何进行分布式计算

    Python如何进行分布式计算

    Python提供了多种进行分布式计算的方法和工具,以下是一些常用的框架和库:
    分布式计算框架和库 Ray:一个基于Python的分布式计算框架,通过简单的API和高效...

  • Java中如何进行图形界面的开发(Swing或JavaFX)

    Java中如何进行图形界面的开发(Swing或JavaFX)

    在Java中进行图形界面(GUI)开发,你可以选择使用Swing或JavaFX。以下是关于这两种技术的简要介绍和示例代码:
    1. Swing
    Swing是Java的一个图形用户界...

  • React中如何进行代码的分割与懒加载

    React中如何进行代码的分割与懒加载

    在React中,我们可以使用React.lazy()函数和React.Suspense组件进行代码分割和懒加载。React.lazy()用于动态导入组件,而React.Suspense用于在组件加载期间显示一...

  • Vue.js中如何进行状态管理的持久化

    Vue.js中如何进行状态管理的持久化

    在Vue.js中,进行状态管理的持久化可以通过多种方式实现,以下是一些常见的方法: LocalStorage/SessionStorage:
    使用Web Storage API,如localStorage或se...