智能指针

[C++] Boost智能指针——boost::shared_ptr(使用及原理分析)

旧时模样 提交于 2019-12-27 07:35:10
简介 boost::shared_ptr是可以 共享所有权 的指针。如果有多个shared_ptr共同管理同一个对象时,只有这些shared_ptr全部与该对象脱离关系之后,被管理的对象才会被释放。通过下面这个例子先了解下shared_ptr的基本用法: 1 #include <iostream> 2 #include <string> 3 #include <boost/shared_ptr.hpp> 4 5 using namespace std; 6 7 class Book 8 { 9 private: 10 string name_; 11 12 public: 13 Book(string name) : name_(name) 14 { 15 cout << "Creating book " << name_ << " ..." << endl; 16 } 17 18 ~Book() 19 { 20 cout << "Destroying book " << name_ << " ..." << endl; 21 } 22 }; 23 24 int main() 25 { 26 cout << "=====Main Begin=====" << endl; 27 { 28 boost::shared_ptr<Book> myBook(new Book("「1984」"

C++智能指针

无人久伴 提交于 2019-12-27 07:34:48
一、为什么使用智能指针?智能指针的原理? C/C++中的堆内存分配和释放的方式主要是: malloc/free 以及 new/delete 等。 使用new 和delete 管理内存存在三个常见问题: 1.忘记delete(释放) 内存,或者异常导致程序过早退出,没有执行 delete。忘记释放动态内存会导致内存泄露问题,长时间这样会导致系统内存越来越小。 (内存泄露问题往往很难查找到,内存耗尽时,才能检测出这种错误) 2.使用已经释放掉的对象。比如:我们使用delete释放掉申请的内存空间,但并未去除指向这片空间的指针,此时指针指向的就是“垃圾”内存。 3.同一块内存释放两次。当有两个指针指向相同的动态内存分配对象时,其中一个进行了delete操作,对象内存就还给了操作系统 ,如果我们要delete第二个指针,那么内存有可能遭到破坏。(浅拷贝问题) 使用智能指针可以很大程度上的避免这些问题。 智能指针就是一个类,类的构造函数中传入一个普通指针,当超出了类的作用域时,类会自动调用析构函数,释放资源。其核心思想是:栈上对象在离开作用范围时会自动析构。 智能指针在C++11版本之后提供,包含在头文件<memory>中,shared_ptr、unique_ptr、weak_ptr,auto_ptr在C++11被弃用。 二、常用的智能指针 1、auto_ptr:自动指针,自动回收

C++ 智能指针weak_ptr用途浅析

蹲街弑〆低调 提交于 2019-12-21 05:06:52
文章目录 C++ 智能指针weak_ptr用途浅析 1. weak_ptr的特性 2. 二叉树的实现 2.1 问题 2.2 方案1 2.3 方案2 3. 总结 C++ 智能指针weak_ptr用途浅析 我们知道C++智能指针有 shared_ptr 和 unique_ptr ,这两种指针基本就可以胜任堆内存的管理了,那么C++为什么还要提出 weak_ptr 呢? weak_ptr 这个东西到底有什么用途呢? 1. weak_ptr的特性 weak_ptr 也是指向 shared_ptr 指向的对象,但是并不管理引用计数和内存,操作如下: 所以,如果要使用weak_ptr,必须锁定为shared_ptr shared_ptr<element_type> lock() const noexcept; 从上面我们也可以知道,weak_ptr的初始化也是从shared_ptr来的,如下: //default (1) constexpr weak_ptr() noexcept; //copy (2) weak_ptr (const weak_ptr& x) noexcept; template <class U> weak_ptr (const weak_ptr<U>& x) noexcept; //from shared_ptr (3) template <class U> weak

C++ 11 相关的智能指针详解

折月煮酒 提交于 2019-12-20 19:40:16
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。 为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。下面我们逐个介绍。 auto_ptr ( 官方文档 ) #include<iostream> #include<memory>//auto_ptr的头文件 using namespace std; class Test { public: Test(string s) { str = s; cout<<"Test creat\n"; } ~Test() { cout<<"Test delete:"<<str<<endl; } string& getStr() { return str; } void setStr(string s) { str = s; }

5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

半世苍凉 提交于 2019-12-19 12:55:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文首发于个人博客 https://kezunlin.me/post/b82753fc/ ,欢迎阅读最新内容! 5 methods for c++ shared_ptr point to an array <!--more--> Guide shared_ptr Prior to C++17 , shared_ptr could not be used to manage dynamically allocated arrays. By default, shared_ptr will call delete on the managed object when no more references remain to it. However, when you allocate using new[] you need to call delete[] , and not delete , to free the resource. In order to correctly use shared_ptr with an array, you must supply a custom deleter. code example //OK, pointer to int 999 std::shared_ptr

C++知识点积累(2)

点点圈 提交于 2019-12-17 13:00:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1 如果出于某些原因,需要在const成员函数中修改某一个或几个成员,那么可以将需要修改的成员声明为mutable,例如 class A { public: int m_cannotBeModified; mutable int m_needToBeModified; void ModifyMutable() const { m_needToBeModified = 1; //合法 m_cannotBeModified = 1; //不合法 } }; 2 如果一个类没有显式声明构造函数,拷贝构造函数,赋值运算符,析构函数,编译器会相应地合成一个,如果类显式定 义了任何一个构造函数,包括拷贝构造函数,编译器就不会再合成构造函数。 3 要阻止一个类对象拷贝或赋值,可以声明一个简单的基类,基类中将拷贝构造函数和赋值运算符声明为private,这样其派生类的拷贝或赋值操作在编译期就可以被检查出来。例如: class A { protected: A(){} ~A(){} private: A(const A& a){} A& operator=(const A&a){} }; class B : public A { }; int main() { B b; //B b1(b); //编译不通过 //B b2 = b;

智能指针类模板——创建智能指针类模板

人盡茶涼 提交于 2019-12-08 21:47:27
#ifndef _SMARTPOINTER_H_ #define _SMARTPOINTER_H_ template < typename T > class SmartPointer { T* mp; public: SmartPointer(T* p = NULL) { mp = p; } SmartPointer(const SmartPointer<T>& obj) { mp = obj.mp; const_cast<SmartPointer<T>&>(obj).mp = NULL; } SmartPointer<T>& operator = (const SmartPointer<T>& obj) { if( this != &obj ) { delete mp; mp = obj.mp; const_cast<SmartPointer<T>&>(obj).mp = NULL; } return *this; } T* operator -> () { return mp; } T& operator * () { return *mp; } bool isNull() { return (mp == NULL); } T* get() { return mp; } ~SmartPointer() { delete mp; } }; #endif #include

智能指针类模板

大城市里の小女人 提交于 2019-12-08 20:25:36
智能指针类模板 智能指针 本质上就是一个对象 ,它可以像原生指针那样来使用。 智能指针的意义 - 现代C++开发库 中最重要的类模板之一 -C++中 自动内存管理 的主要手段 -能够在很大程度上 避开内存相关的问题   1. 内存泄露 ,在测试阶段很难发现。造成的原因就是申请堆空间中的内存,忘记释放。    2. 多次指针释放 :一个指针指向了一片堆空间中的内存,这片内存只需要释放一次,如果在代码中不小心释放了多次,后果也是不确定的,有可能程序马上会死掉,有可能程序过一段时间才死掉。 STL中的智能指针auto_ptr -生命周期结束时, 销毁指向的内存空间 - 不能指向堆数组 ,只能指向堆对象(变量)——如果使用堆数组,可以使用上篇博客中的heapArray - 一片堆空间只属于 一个智能指针对象 - 多个智能指针对象不能指向同一片堆空间 来源: https://www.cnblogs.com/-glb/p/12007010.html

C++内存泄漏及解决方法

巧了我就是萌 提交于 2019-12-08 11:15:25
1.首先说到c++内存泄漏时要知道它的含义? 内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏 并非指内存在物理上的消失,而是 应用程序 分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2.内存泄漏的后果? 最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。 只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。 更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。 此外,即使无害的内存泄漏也可能是其他问题的征兆。 3.对于C和C++这种没有垃圾回收机制的语言来讲,我们主要关注两种类型的内存泄漏: (1)堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak. (2)系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle

使用智能指针解决可能导致的内存泄漏的问题

て烟熏妆下的殇ゞ 提交于 2019-12-08 11:12:30
一个程序中可能会因为各种情况导致内存泄漏的问题,程序泄漏可能不会一下子被写程序的人发现,因为它可能是一点点的被泄漏,直到内存被耗尽之后才会知道内存泄漏这个问题,但是我们不应该写出这样的程序来坑我们自己。因此在写程序的时候应该尽量避免这类问题的产生 执行流跳转是什么??在一个程序顺序往下执行的时候,在遇到return , break, goto,continue等语句的时候,就会引发执行流跳转。假如说我们在程序开头部分new了一个变量或其他,那么与它配套使用的delete就应该出现在它的下一句,但是可能在他们两中间要有一些条件执行,这些条件中的某些语句可能引发程序结束或退出,那么后面的delete语句则不会被执行,也就是说我们前面申请的空间没有还给系统,这样就会导致内存的泄漏。 如何解决这个问题?RAII(资源分配即初始化)就可以解决。RAII是一种解决问题的思想,用一个类来封装资源的分配和释放,不是具体的某种实现的类或者函数,基于它的思想提出的智能指针是解决问题的根本。 智能指针在快速发展的互联网发展过程中也分为如下几类: AutoPtr:自动指针管理权转移 template < class T> class AutoPtr { public : AutoPtr(T* ptr) :_ptr(ptr) {} ~AutoPtr() { if (_ptr) { cout << "haha