C++智能指针

在这里插入图片描述


在C++中,智能指针是一种替代原始指针的类模板,用于自动管理内存。智能指针的主要目标是帮助防止内存泄漏和其他与内存管理相关的问题。

C++11引入了三个智能指针模板:std::unique_ptrstd::shared_ptrstd::weak_ptr。这些智能指针模板都有各自的特点和用途。


1. std::unique_ptr

std::unique_ptr表示一个独占所有权的智能指针,即同一时间只能有一个unique_ptr指向一个对象。当unique_ptr被销毁时(例如离开其作用域或重新分配给另一个对象),它所指向的对象也会被自动删除。

示例:

std::unique_ptr<int> ptr1(new int(42));
// ptr1拥有该int对象的所有权,并且是独占的。

示例:

#include <memory>  
//std::unique_ptr:表示独占所有权的智能指针。
struct Foo {  
    Foo() { std::cout << "Foo::Foo\n"; }  
    ~Foo() { std::cout << "Foo::~Foo\n"; }  
};  
  
int main() {  
    std::unique_ptr<Foo> ptr(new Foo); // 创建 Foo 对象,并由 unique_ptr 独占所有权  
    // 在 unique_ptr 生命周期结束时,它会自动删除所拥有的对象  
}

2. std::shared_ptr

std::shared_ptr表示一个共享所有权的智能指针。多个shared_ptr可以同时指向同一个对象,而对象的生命周期将延长直到最后一个shared_ptr被销毁。当最后一个shared_ptr被销毁时,对象会被自动删除。

示例:

std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::shared_ptr<int> ptr2 = ptr1; // ptr1和ptr2现在都指向该int对象

示例:

#include <memory>  
#include <iostream>  
//std::shared_ptr:表示共享所有权的智能指针。
struct Bar {  
    Bar() { std::cout << "Bar::Bar\n"; }  
    ~Bar() { std::cout << "Bar::~Bar\n"; }  
};  
  
int main() {  
    std::shared_ptr<Bar> ptr1 = std::make_shared<Bar>(); // 创建 Bar 对象,并由 shared_ptr 管理  
    std::shared_ptr<Bar> ptr2 = ptr1; // ptr2 和 ptr1 共享所有权  
    // 当最后一个拥有该对象的 shared_ptr 被销毁时,它会自动删除所拥有的对象  
}

3. std::weak_ptr

std::weak_ptr是一个不拥有对象的智能指针,它只是观察对象,不会影响对象的生命周期。它通常用于解决循环引用问题,与std::shared_ptr一起使用。

示例:

std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::weak_ptr<int> ptr2 = ptr1; // ptr2观察ptr1指向的对象,但不会延长其生命周期。

示例:

#include <memory>  
#include <iostream>  
//std::weak_ptr:通常与 std::shared_ptr 一起使用,以避免循环引用。
struct Baz {  
    Baz() { std::cout << "Baz::Baz\n"; }  
    ~Baz() { std::cout << "Baz::~Baz\n"; }  
};  
  
int main() {  
    std::shared_ptr<Baz> ptr1 = std::make_shared<Baz>(); // 创建 Baz 对象,并由 shared_ptr 管理  
    std::weak_ptr<Baz> ptr2 = ptr1; // ptr2 不拥有该对象,只是观察它  
    // 当 ptr1 销毁时,ptr2 的观察权也将失效,如果 ptr1 仍然存在,ptr2 可以观察到它,否则它就无效了。  
}

使用智能指针替代原始指针可以帮助减少内存泄漏和简化内存管理,但也需要正确使用它们来避免其他问题,例如过度使用或错误使用。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++智能指针是一种用于管理动态分配的内存资源的工具。C++中提供了多种类型的智能指针,其中包括shared_ptr、unique_ptr和weak_ptr。这些智能指针都位于头文件<memory>中。 其中,shared_ptr是一种引用计数智能指针,它允许多个智能指针共享同一个对象。shared_ptr通过对对象的引用计数来管理内存的释放,当引用计数为0时,即没有智能指针指向该对象时,对象会被自动释放。使用shared_ptr需要包含头文件<memory>,并通过new关键字创建动态分配的对象并将其交给shared_ptr进行管理。 另一种智能指针是unique_ptr,它是一种独占型智能指针,只能有一个智能指针拥有对对象的所有权。当unique_ptr对象被销毁时,它所管理的对象也会被自动释放。unique_ptr提供了更高效的内存管理方式,因为它不需要进行引用计数。使用unique_ptr也需要包含头文件<memory>,并使用new关键字创建动态分配的对象并将其交给unique_ptr进行管理。 除了shared_ptr和unique_ptr,还有其他类型的智能指针,如weak_ptr和scoped_ptr。weak_ptr是一种弱引用智能指针,它用于解决shared_ptr可能出现的循环引用问题。scoped_ptr是一种简单的智能指针,它只能在创建时初始化,并且不能进行复制和赋值操作。scoped_ptr在其所属的作用域结束时自动释放所管理的对象。 总结起来,C++智能指针是一种用于管理动态分配的内存资源的工具,包括shared_ptr、unique_ptr、weak_ptr和scoped_ptr等类型。它们提供了一种更安全、更高效的内存管理方式,避免了手动释放内存的麻烦。要使用这些智能指针,需要包含头文件<memory>,并通过new关键字创建动态分配的对象并将其交给相应的智能指针进行管理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++ -- 智能指针C++11与boost库的智能指针及其使用)](https://blog.csdn.net/xu1105775448/article/details/80625936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++智能指针的底层实现原理](https://blog.csdn.net/ArtAndLife/article/details/120793343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值