展开

关键词

C++智能指针

argc, char *argv[]) { QCoreApplication a(argc, argv); test(); return a.exec(); }   我们通过Qt的 NULL,防止出现悬空指针。 三、智能指针   本文以Qt中提供的智能指针为例,首先,智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。 在上面的例子,可以改为代码: void test() { QSharedPointer<BBE> n(new BBE); n->X = 10; n->Y = 20; n ->show(); }   可以看到,使用智能指针的话,不需要手动delete内存了。

6830

C++ 智能指针

转载自:C++ 智能指针详解 简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。 ,表明上述赋值成功 (*my_memory).info_extend += " other"; // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象的函数 由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 的智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。 讲完如上 6 种智能指针后,对于一般程序来说 C++ 堆内存管理就够用了,现在有多了一种 boost::intrusive_ptr,这是一种插入式的智能指针,内部不含有引用计数,需要程序员自己加入引用计数 总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

56940
  • 广告
    关闭

    《云安全最佳实践-创作者计划》火热征稿中

    发布文章赢千元好礼!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ 智能指针

    什么是智能指针? 今天之前我对这个概念也很陌生,但是接触之后我便很喜欢这种指针了。 与其说是指针,不如说是一种基于指针的模板类。 智能指针存在的意义? 要创建智能指针对象,首先要包它们的头文件memory. List item 不要将 *this指针交给智能指针。 List item 不要在函数实参创建shared_ptr function (shared_ptr (new int),g());//有缺陷 正确的写法应该是先创建智能指针: shared_ptr p(new int()); f(p,g()); 什么时候释放智能指针

    21710

    C++智能指针

    1.智能指针的由来 C++,动态内存的管理是通过一对运算符来完成的,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL的shared_ptr支持多个智能指针管理同一个对象。 C++准标准库Boost智能指针,比如boost::scoped_ptr、boost::shared_array、boost:: intrusive_ptr在这里不做研究,有兴趣的读者可以参考:C+ 7.如何选择智能指针? 在掌握了上面提到的C++ STL的四种智能指针后,大家可能会想另一个问题:在实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。 C++中文版(第三版).2011:61-77 [3]C++智能指针简单剖析 [4]shared_ptr基于引用计数智能指针实现 [5] C++智能指针的设计和使用 [6]C++11智能指针

    1.3K30

    详解 C++ 11 智能指针

    我们在实际开发应该避免做出这样的逻辑设计,这种情形下即使使用了智能指针也会造成内存泄漏。也就是说一个资源的生命周期可以交给一个智能指针对象,但是该智能指针的生命周期不可以再交给整个资源来管理。 智能指针使用注意事项 C++ 新标准提倡的理念之一是不应该再手动调用 delete 或者 free 函数去释放内存了,而应该把它们交给新标准提供的各种智能指针对象。 C++ 新标准的各种智能指针是如此的实用与强大,在现代 C++ 项目开发,读者应该尽量去使用它们。 ); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准智能指针我想介绍的就这么多了,Modern C/C++ 已经变为 C /C++ 开发的趋势,希望读者能善用和熟练使用本节介绍的后三种智能指针对象。

    71731

    C++ 智能指针详解

    http://blog.csdn.net/xt_xiaotian/article/details/5714477 C++ 智能指针详解 一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new ,表明上述赋值成功 (*my_memory).info_extend += " other";           // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象的函数 由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 的智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。 讲完如上 6 种智能指针后,对于一般程序来说 C++ 堆内存管理就够用了,现在有多了一种boost::intrusive_ptr,这是一种插入式的智能指针,内部不含有引用计数,需要程序员自己加入引用计数 三、总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

    1.3K10

    C++基础 智能指针

    智能指针基础原理 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期,实现内存的自我回收。 于是我们就想:如果是Test *t不是一个普通的指针变量,而是一个类对象的话,并且在类的析构函数实现了释放动态内存的步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存的目的。 C++11智能指针 四种智能指针 C++ STL为我们提供了四种智能指针: auto_ptr( C++98提供,C++11建议弃用) 主要是用来解决**最基本**的资源自动释放问题 unique_ptr 对于特定对象,同一时刻只能有一个智能指针可拥有, 最终只有拥有对象的智能指针的构造函数会删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高的指针,跟踪引用特定对象的智能指针个数 选择使用参考 如果程序要使用多个指向同一个对象的指针,那么应该使用shared_ptr 比如说现在有一个包含指针的STL容器,现在用某个支持复制和赋值操作的STL算法去操作该容器的指针元素,那么就应该用

    20120

    C++智能指针简介

    1.智能指针的由来 C++,动态内存的管理是通过一对运算符来完成的,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针。 为了更容易且更安全的管理动态内存,C++推出了智能指针(smart pointer)类型来管理动态对象。 对动态内存的管理,可以引申为对系统资源的管理,但是C++程序动态内存只是最常使用的一种资源,其他常见的资源还包括文件描述符(file descriptor)、互斥锁(mutex locks)、图形界面的字型和笔刷 智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL的shared_ptr支持多个智能指针管理同一个对象。 4.智能指针的实现模板 智能指针管理对象,本质上是以栈对象来管理堆对象,在《Effective C++》的条款13称之为资源获取即初始化(RAII,Resource Acquisition Is Initialization

    70930

    C++智能指针详解

    参考资料:《C++ Primer中文版 第五版》 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。 在C++,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存 标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件智能指针的使用方式和普通指针类似,解引用一个智能指针返回它指向的对象,在一个条件判断中使用智能指针就是检测它是不是空。 如果这种形式的new不能分配所需内存,它会返回一个空指针。bad_alloc和nothrow都在头文件new

    6030

    c++ this指针详解

    this 是 c++的一个关键字,也是一个常量指针,指向当前对象,也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。 【特性】 1. 只有在类的非静态成员函数才可以使用this指针 所谓的当前对象,就是正在使用的对象,例如stu.print(); stu 就是当前对象,系统正在访问stu的成员函数print() 假设this指向stu 上面的例子创建stu1时,this指针就指向了stu1所在内存块的首字节,创建stu2时,this指针就指向了stu所在内存块的首字节… 现在添加下面的函数 用来输出this的值,验证this的值与 ,它并不出现在参数列表,调用成员函数时,系统(编译器)自动获取当前对象的地址,并赋给this,完成参数的传递。 在《C++函数编译原理和成员函数的实现》讲到,成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以在编译时要在成员函数添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量

    7750

    C++智能指针简单剖析

    http://blog.csdn.net/lanxuezaipiao/article/details/41603883 导读 最近在补看《C++ Primer Plus》第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰 C++面试过程,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等……。 而且在看开源的C++项目时,也能随处看到智能指针的影子。这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值。 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰。 目录 智能指针背后的设计思想 C++智能指针简单介绍 为什么摒弃auto_ptr? unique_ptr为何优于auto_ptr? 如何选择智能指针? 正文 1. C++智能指针简单介绍 STL一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr和weak_ptr(本文章暂不讨论)。

    20310

    C++智能指针「建议收藏」

    ,主要用到了这两点: 智能指针体现在把裸指针进行了面向对象的封装,在构造函数初始化资源地址,在析构函数负责释放资源 利用栈上的对象出作用域自动析构这个特点,在智能指针的析构函数中保证释放资源。 就好比SmartPtr<int>* ptr = new SmartPtr<int>();这段代码,在堆空间定义一个智能指针,这依然需要我们手动进行delete,否则堆空间的对象无法释放,因为堆空间的对象无法利用出作用域自动调用析构函数 ,对象析构时,会出现同一资源释放两次的错误(释放野指针),这里需要解决两个问题: 智能指针的浅拷贝 多个智能指针指向同一个资源的时候,怎么保证资源只释放一次,而不是每个智能指针都释放一次 不带引用计数的智能指针主要包括 : C++库提供的auto_ptr C++11提供的scoped_ptr,unique_ptr (1)auto_ptr auto_ptr<int> ptr1(new int); auto_ptr ,会release其他智能指针的资源 三、带引用计数的智能指针shared_ptr、weak_ptr 当多个智能指针指向同一个资源的时候,每一个智能指针都会给资源的引用计数加1,当一个智能指针析构时,同样会使资源的引用计数减

    5610

    C++智能指针学习(一)

    好了,废话就不多说,看内容: 一、智能指针的概念: C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数释放掉申请的内存,从而防止内存泄漏。 简要的说,智能指针利用了 C++ 的 RAII 机制,在智能指针对象作用域结束后,会自动做内存释放的相关操作,不需要我们再手动去操作内存。 正因为 std::auto_ptr 的设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库智能指针的设计思想,引入了三种类型的智能指针,即:std::unique_ptr、std: 在 C++11 可以通过 std::unique_ptr 达到与 boost::scoped_ptr 一样的效果。 所有的智能指针类(包括 std::unique_ptr)均包含于头文件

    11820

    c++基础 使用智能指针

    三个智能指针模板(auto_ptr、unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直接或间接) 的地址赋给这种对象。 当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给 这些对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存将自动被释放。 下图说明了auto_ptr和常规指针在行为方面的差另:share_ptr和unique_ptr的行为与auto_ptr相同 ? 使用智能指针必须包含头文件memory文件模板定义。 它是构造函数auto_ptr<double>的参数,即对应于 原型形参p的实参。同样,new string 也是构造函数的实参。 if(error)     throw exception();   str=*ps;   return ; } 智能指针模板位于名称空间std

    34950

    C++this指针的本质

    一直以来对C++的this不理解,只知道在构造函数,如果构造函数的参数和类成员的名字一样的话,就可以用this指针来区分,如: this->a = a; 一直以来都有这个疑问:this究竟是什么? 从刚才的代码,我们用”this->”而不是”this.”就说明this是一个指针,而我们知道,在C、C++指针就是地址,因此很容易想到,this也是一个地址。但是问题来了,this是谁的地址呢? 我们看下面这个很简单的C++程序: #include <iostream> class A { public: A(); }; A::A() { std::cout << "this endl; } int main() { A a; std::cout << "&a " << &a << std::endl; return 0; } 大家先在自己的脑袋运行一下这个程序

    7430

    浅析C++的this指针

    pNull(也就是this指针)放到ecx寄存器(mov ecx,dword ptr [pNull])。 看call 3那行C++代码的汇编代码就可以看到this指针跟一般的函数参数的区别:一般的函数参数是直接压入栈(push 0Dh),而this指针却被放到了ecx寄存器。 : 1、将ecx寄存器的值压栈,也就是把this指针压栈。 此时,this指针指向test对象,test对象只有两个int型的成员变量,在test对象内存连续存放,也就是说this指针目前指向m_iValue1。 通过上面的分析,我们可以从底层了解了C++this指针的实现方法。虽然不同的编译器会使用不同的处理方法,但是C++编译器必须遵守C++标准,因此对于this指针的实现应该都是差不多的。

    4710

    彻底搞懂之C++智能指针

    前言 在现代 c + + 编程,标准库包含 智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。 shared_ptr shared_ptr 类型是 C++ 标准库的一个智能指针,是为多个所有者可能必须管理对象在内存的生命周期的方案设计的。 因此,当需要纯 C++ 对象的智能指针时,请使用make_unique帮助程序函数。 下图演示了两个 unique_ptr 实例之间的所有权转换。 unique_ptr 在 C++ 标准库的标头中 <memory> 定义。 它与原始指针一样高效,可在 C++ 标准库容器中使用。 智能指针的错误用法 1、使用智能指针托管的对象,尽量不要在再使用原生指针 很多开发同学(包括我在内)在最开始使用智能指针的时候,对同一个对象会混用智能指针和原生指针,导致程序异常。

    5810

    现代C++之手写智能指针

    现代C++之手写智能指针 0.回顾 ? 所有代码还是放在仓库里面,欢迎star! 我们是不是可以考虑在拷贝智能指针时把对象拷贝一份?不行,通常人们不会这么用,因为使用智能指针的目的就是要减少对象的拷贝啊。 而这时就有一群人开始扩展C++标准库的关于智能指针的部分,他们组成了boost社区,他们负责boost库的开发和维护。其目的是为C++程序员提供免费的、同行审查的、可移植的程序库。 boost库可以和C++标准库完美的共同工作,并且为其提供扩展功能。现在的C++11标准库的智能指针很大程度上“借鉴”了boost库。 把赋值函数的参数类型 unique_ptr& 改成了 unique_ptr,在构造参数时直接生成新的智能指针,从而不再需要在函数体构造临时对象。

    1.5K10

    C++智能指针原理和实现

    一、智能指针起因   在C++,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。    使用堆内存是非常频繁的操作,容易造成堆内存泄露、二次释放等问题,为了更加容易和更加安全的使用动态内存,C++11引入了智能指针的概念,方便管理堆内存,使得自动、异常安全的对象生存期管理可行。 智能指针主要思想是RAII思想,“使用对象管理资源”,在类的构造函数获取资源,在类的析构函数释放资源。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。    二、智能指针类型 智能指针在C++11版本之后提供,包含在头文件<memory>,标准命名std空间下,有auto_ptr、shared_ptr、weak_ptr、unique_ptr四种,其中auto_ptr auto_ptr是最早期的智能指针,在C++11 已被弃用,C++17 移除,建议使用unique_ptr代替auto_ptr。

    15230

    C++智能指针:unique_ptr

    引入了unique_ptr之后,可以有效的减轻C++程序员对于raw pointer的使用负担。 Foo // unique_str调用构造函数创建指针 About to release Foo... 但却有一个例外:可以从函数返回一个unique_ptr。 4.提供了 move 操作,因此我们可以用std::move()来转移unique_ptr。

    29810

    相关产品

    • 智能数据分析

      智能数据分析

      智能数据分析( IDA)基于安全、低成本、高可靠、可弹性的云端大数据架构,帮助企业客户实现从数据采集、建模、挖掘、效果分析、用户标签画像到自动化营销等全场景的数据服务,快速实现数据驱动业务增长的目标。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券