赞
踩
在 C++ 中,智能指针是一种封装了动态分配内存的指针类,它们能够自动处理分配和释放内存的操作,从而避免出现内存泄漏的问题。C++ 中的智能指针有三种:std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
(auto_ptr
在 C++11 中被摈弃)。它们的具体用法如下:
std::unique_ptr
能自动释放动态分配的对象,以达到避免内存泄漏的目的。该类的特点是:只有一个 std::unique_ptr
类型的指针可以指向其封装的指针对象,这就意味着一个 std::unique_ptr
类型的指针不能被复制,但可以被移动(即所有权可以转移)。以下是一个示例:
std::unique_ptr<int> ptr(new int(3)); // 声明一个 std::unique_ptr,将其初始化为指向堆上分配的 int 类型对象
std::cout << *ptr << std::endl; // 输出 3
std::shared_ptr
是一个可共享的指针类,它可以使多个指针指向同一个指针对象,以达到共享资源的目的。同时,该类也能自动处理动态分配对象的内存释放,以避免内存泄漏。以下是一个示例:
std::shared_ptr<int> ptr1(new int(4)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
std::shared_ptr<int> ptr2 = ptr1; // 通过构造函数将 ptr2 初始化为 ptr1 的副本,此时 ptr1 和 ptr2 指向同一个对象,其计数器为 2
std::cout << *ptr1 << "," << *ptr2 << std::endl; // 输出 4,4
// 当超出 ptr1 和 ptr2 的作用域时,其引用计数会减少 1,当计数为 0 时,自动释放堆内存
std::weak_ptr
允许您在不影响引用计数的情况下,以非剥夺方式获得与 std::shared_ptr
具有相同目的的对象引用。可以使用 std::weak_ptr
防止引用计数循环引用。以下是一个示例:
std::weak_ptr<int> wp;
{ // 内嵌作用域
std::shared_ptr<int> sp(new int(5)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
wp = sp; // 使用 std::weak_ptr 初始化一个分离的引用,此时 sp 和 wp 指向同一个对象,其计数器为 1
std::cout << "wp: " << *wp.lock() << std::endl; // 输出 wp 所指向的对象的值,即 5,使用 weak_ptr::lock 获得 shared_ptr,调用 shared_ptr 的操作符 * 访问值
} // sp 离开作用域,并自动释放堆内存
std::cout << "wp: " << (wp.expired() ? "expired" : "alive") << std::endl; // 输出 wp 是否引用了已释放的堆内存
在使用智能指针时,通常可以使用 std::make_unique
和 std::make_shared
来分配动态内存。例如:
std::unique_ptr<Foo> fooPtr = std::make_unique<Foo>();
std::shared_ptr<Foo> fooSharedPtr = std::make_shared<Foo>();
make_unique
的具体用法
以上便简单介绍了 C++ 中智能指针的用法。需要注意的是,智能指针不是万能的,它们只是一种编写更安全和简单代码的方法,而不是一个解决所有内存管理问题的魔法解决方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。