首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std :: tr1中的shared_ptr

在C++中,std::tr1是一个技术标准库,它包含了一些实验性的C++库,其中之一就是std::tr1::shared_ptrstd::tr1::shared_ptr是一个智能指针,它提供了一种方法来管理动态分配的对象,并在不再需要时自动释放它们。

std::tr1::shared_ptr的主要优势是它可以自动管理对象的生命周期,从而避免了内存泄漏和悬挂指针的问题。它通过引用计数来跟踪对象的所有者数量,当最后一个所有者被销毁时,它会自动删除对象。

std::tr1::shared_ptr的应用场景包括但不限于:

  • 在容器中存储对象的指针,例如std::vector<std::tr1::shared_ptr<MyObject>>
  • 在多线程环境中共享对象,例如在多个线程之间传递对象的指针
  • 在函数调用之间传递对象的所有权,例如在函数中返回一个动态分配的对象

虽然std::tr1::shared_ptr是一个非常有用的工具,但它也有一些缺点,例如它可能会导致性能问题,因为它需要使用原子操作来更新引用计数。此外,它也可能会导致循环引用的问题,因为当两个对象相互引用时,它们的引用计数永远不会变为零。

总之,std::tr1::shared_ptr是一个非常有用的工具,可以帮助开发人员更好地管理动态分配的对象。但是,开发人员需要注意它的一些缺点,并确保在使用时遵循最佳实践。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective C++第17条:要在单独语句中使用智能指针来存储由new创建对象

tr1::shared_ptr 构造函数包含了一个 explicit 裸指针,于是便不存在从“ new Widget ”语句返回裸指针到 processWidget 所需 tr1::shared_ptr...然而下边代码将顺利通过编译: processWidget(std::tr1::shared_ptr(new Widget), priority()); 看上去有些令人吃惊,尽管我们时时刻刻使用对象来管理资源...在这种情况下,由于“ new Widget ”返回指针不会如我们所愿保存在 tr1::shared_ptr ,因此它很有可能会丢失,于是内存泄漏就发生了。...防止这类问题发生办法很简单:使用单独语句,创建 Widget 并将其存入一个智能指针,然后将这个智能指针传递给 processWidget : std::tr1::shared_ptr<Widget...由于这段改进代码,“ new Widget ”语句以及对 tr1::shared_ptr 构造函数调用在单独语句中,对 priority 调用在另一个单独语句中,所以编译器就没有机会调换处理顺序了

44460

std::shared_ptr 线程安全性 & 在多线程使用注意事项

std::shared_ptr 是个类模版,无法孤立存在,因此实际使用,我们都是使用他具体模版类。...这里使用 std::shared_ptr 来举例,我们讨论时候,其实上是在讨论 std::shared_ptr 线程安全性,并不是 SomeType 线程安全性。...::shared_ptr ptr; ptr->DoSomething(); return 0; } 这里例子,如果 ptr->DoSomething () 是运行在多线程...我们可以得到下面的结论: 多线程环境,对于持有相同裸指针 std::shared_ptr 实例,所有成员函数调用都是线程安全。...->() 等) 多线程环境,对于同一个 std::shared_ptr 实例,只有访问 const 成员函数,才是线程安全,对于非 const 成员函数,是非线程安全,需要加锁访问。

2.4K10

【C++航海王:追寻罗杰编程之路】智能指针

3.4 -> std::unique_ptr std::unique_ptr文档介绍 C++11开始提供更靠谱unique_ptr。...std::shared_ptr文档介绍 C++11开始提供更靠谱并且支持拷贝shared_ptr。...需要注意shared_ptr线程安全分为两个方面: 智能指针对象引用计数是多个智能指针对象共享,两个线程智能指针引用计数同时++或--,引用计数原来是1,++了两次,可能还是2。...// 3.下面代码我们使用SharedPtr演示,是为了方便演示引用计数线程安全问题, // 将代码SharedPtr换成shared_ptr进行测试,可以验证库shared_ptr,发现结论是一样...C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr。 C++ TR1,引入了shared_ptr等。不过值得注意TR1并不是标准版。

4910

C++智能指针

C++智能指针 零、前言 一、为什么需要智能指针 二、内存泄漏 三、智能指针 1、RAII 2、智能指针原理 3、std::auto_ptr 4、std::unique_ptr 5、std::shared_ptr...6、std::weak_ptr 7、删除器 8、C++11和boost智能指针关系 零、前言 本章主要讲解学习C++智能指针概念及使用 一、为什么需要智能指针 示例: double Division...:只声明不实现+声明成私有;C++11防拷贝方式修饰函数为delete 5、std::shared_ptr 概念及介绍: C++11开始提供更靠谱并且支持拷贝shared_ptr shared_ptr...C++11和boost智能指针关系 C++ 98 中产生了第一个智能指针auto_ptr C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr C++ TR1...不过注意TR1并不是标准版 C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。需要注意是unique_ptr对应boostscoped_ptr。

59720

C++ std::string 类

C++ 在其定义中有一种将字符序列表示为 class 对象方法。这个类叫做 std::string。String 类将字符存储为具有允许访问单字节字符功能字节序列。 ...std:: 字符串与字符数组 字符数组只是一个可以由空字符终止字符数组。字符串是定义表示为字符流对象类 字符数组大小必须静态分配,如果需要,不能在运行时分配更多内存。...字符串操作 输入函数 1. getline()  :- 该函数用于在对象内存存储用户输入字符流。 2. push_back()  :- 该函数用于在字符串末尾 输入一个字符。...3. pop_back()  :- 从 C++11 引入(用于字符串),该函数用于删除字符串最后一个字符。...它需要 3 个参数,目标字符数组,要复制长度和开始复制字符串起始位置。 13. swap()  :- 该函数将一个字符串与另一个字符串交换**。

1.1K20

Effective C++: 改善程序与设计55个具体做法

■ 两个常被使用RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。...■ “阻止误用”办法包括建立新类型、限制类型上操作,束缚对象值,以及消除客户资源管理责任。 ■ tr1::shared_ptr支持定制型删除器(custom deleter)。...■ 为“用户定义类型”进行std templates全特化是好,但千万不要尝试在std内加入某些对std而言全新东西。...■ TR1添加了智能指针(例如 tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-based容器、正则表达式(regular expressions)以及另外10...致力于免费、源码开放、同僚复审C++程序库开发。Boost在C++标准化过程扮演深具影响力角色。 ■ Boost提供许多TR1组件实现品,以及其他许多程序库。

67220

【C++】基础:Effective C++高效编程建议

两个通用 RAII 是 tr1::shared_ptr 和 auto_ptr。tr1::shared_ptr 通常是更好选择,因为它拷贝时行为是符合直觉。...在一个独立语句中将 new 出来对象存入智能指针 用一个单独语句创建 Widget 并将它存入一个智能指针,然后将这个智能指针传递给 processWidget: std::tr1::shared_ptr...预防错误方法包括创建新类型,限定类型操作,约束对象值,以及消除客户资源管理职责。 tr1::shared_ptr 支持自定义 deleter。...& std::max(const T& a, const T& b) // request: std::max is { return a < b ?...避免覆盖(hiding)“通过继承得到名字” derived classes 名字覆盖 base classes 名字,在 public inheritance ,这从来不是想要

10510

C++std::getline()函数用法

std::getline 在头文件 定义. getline从输入流读取字符, 并把它们转换成字符串. 1) 行为就像UnformattedInputFunction, 除了input.gcount...()不会受到影响.在构造和检查岗哨对象, 执行以下操作: 1) 调用str.erase() 2) input并把它们添加到str字符提取出来, 直到发生以下情况之一列出顺序进行检查 a) 上input...文件结束条件, 在这种情况下, getline套eofbit和回报. b) 下一个可用输入字符delim, Traits::eq(c, delim), 在这种情况下, 分隔符是从input提取进行了测试...参数 input - 流获取数据 str - 把数据转换成字符串 delim - 分隔符 返回值 input Notes When used...(line); } std::cout << "\nThe sum is: " << sum << "\n"; } 可能输出: What is your name?

7.4K20
领券