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

C++在设计使用智能指针

为一个C++用户的。使用指针可以算的上是常态,但在使用过程中。多的时间,可能是由于new要么malloc对象,上次忘记的释放结束(我会犯这样一个错误)。内存泄露。...而此时智能指针可能能够帮助我去解决问题。 智能指针(smart pointer)是利用个引用计数的策略去处理指针的释放,从而保证指针的安全性。...通常情况下,我们会自己去设计一个智能指针去管理自己的指针对象。 事实上其原理是存储指向动态分配的指针对象。通过引用计数的功能去控制,去正确的实现指针对象的销毁,从而避免内存泄露。...智能指针的原理是。通过将指针一个引用计数关联起来,而引用计数计算,当前指针被多少个对象所共享。...->*操作符,从而使其表现指针的表象,而且大家能够使用它像使用指针一样。

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

C++多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态的理解层次 | 父指针子类指针步长 )

对象可以直接获取到自身封装的 普通函数 , 如果要访问虚函数 , 需要增加一次寻址操作 , 因此 这里建议不需要将有 多态 需求的函数声明为 虚函数 ; C++ 中 指向某类型对象的 指针 的 运算 ,...没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父指针 的步长是相同的 ; 一、不建议将所有函数都声明为 virtual 虚函数 C++ 中 , 每个 成员函数 都可以声明为 virtual...这里建议不需要将有 多态 需求的函数声明为 虚函数 ; 二、多态的理解层次 多态的理解层次 : 多态实现效果 : 相同的代码调用 , 有不同的表现形态 ; 父指针 可 指向子类对象 , 使用指针...; 三、父指针子类指针步长 指针数据类型 : C++指针 是 数据类型 的 一种 , 对 指针 进行 自增 ++ 或 自减 – 操作 , 指针的 地址值 是根据 指针类型 改变的 ; 指针运算...或 指针运算时 , 指针 或 数组 的类型 必须一致 , 一定不能使用多态 ; 指针步长自增 是 根据 声明的 类型 进行自增的 , 不是根据 指针实际指向的对象类型的大小进行自增的 ; 指针的 步长

20150

C++智能指针内存管理:使用指南和技巧

智能指针也是这种思想的一种扩展,它在析构时自动释放资源。 C++中的几种智能指针 C++中有三种智能指针:unique_ptr、shared_ptrweak_ptr。...可以通过weak_ptr的lock()成员函数来获取一个指向所管理的对象的shared_ptr。...C++中有三种智能指针:unique_ptr、shared_ptrweak_ptr。每种智能指针都有其特点,程序员可以根据实际情况选择使用。...在使用智能指针时,需要注意以下几点: 不要将普通指针智能指针混用,避免重复释放内存或内存泄漏。 不要将同一个对象交给不同的智能指针管理,避免引用计数出现错误。...使用智能指针可以大大提高代码的可读性可维护性,建议大家在编写C++程序时多加使用

38800

C++核心准则R.37: 不要使用从破损的智能指针获取指针或引用

R.37: Do not pass a pointer or reference obtained from an aliased smart pointer R.37: 不要使用从破损的智能指针获取指针或引用...违反本规则是引用计数丢失和发生悬空指针的第一号理由。函数更应该沿着调用链向下传递原始指针引用。你应该在调用树的最顶端,从可以保证对象存在的智能指针获得原始指针或引用。...要做到这点,你需要获取一个智能指针的局部拷贝,通过它可以在函数调用树执行期间将对象牢牢地锁定。...(简单)如果函数调用时使用了一个从非局部智能指针变量(Unique_pointer or Shared_pointer)获取指针或者引用,报警。智能指针是局部变量但是可能是别名时也报警。...如果智能指针是一个Shared_pointer,建议获取一个智能指针的局部拷贝然后从该拷贝获取指针或引用。

50030

【笔记】《Effective C++》条款1-25

这些行为结果并非报错, 而是与编译器执行环境相关的无法估计的结果 "接口"通常指函数的签名 1 让自己习惯C++ 1 视C++为一个语言联邦 将C++看作是以多个相关语言组成的结合体而不是一个关系紧密的单一语言...C++11后加入了=delete操作, 让我们可以明确删除某些函数的生成 7 为多态声明virtual析构函数 对所有多态来说, 声明虚析构函数非常重要, 这是因为派生如果被基指针指着, 然后被...加太多功能 16 成对使用的newdelete时要采取相同的形式 由于下图的内存排列特性, 不要混淆不同的newdelete, 否则容易引发未定义行为. delete[]会对内存最前面进行大小读取..., 从而确认析构的次数并进行多次析构 因此newdelete一定要成对使用 尽量不要对数组形式使用typedef, 容易让自己忘掉delete[] 17 以独立语句将newed对象置入智能指针...), 起到多态的效果 传引用的底层实现是指针, 因此对于内置类型STL迭代器与STL函数对象, 传值的效率会高于传引用, 这是底层决定的.

97330

《Effective C++》读书摘要

十二、复制对象要面面俱到 不要丢失基成员的复制。 (三)、资源管理 十三、对象管理资源 构造函数获得资源,析构函数释放资源; 使用智能指针封装:tr1::shared_ptrauto_ptr。...十五、资源管理提供原始资源访问 原始资源获取; 隐式转换——类型转换函数。 十六、new-delete同型成对 []的出现与否要对应起来,即使使用了typedef重命名了数组类型。...十七、独立成句的new对象放入智能指针 将new对象转换为智能指针作为参数,可能会被编译器结合其他参数调整顺序,造成内存泄漏。...二十三、用非成员函数非友元函数替换成员函数 封装强度改变强度成反比,因为只影响有限的用户; 外访问函数封装性好于累内成员函数的封装性,不增加累内私有数据的访问函数的数量; 二十四、参数需要类型转换应使用成员函数...三十一、降低文件间编译依存关系 能使用引用指针完成的不使用对象、用class声明代替定义,并提供不同的头文件——程序库文件定义头文件; handle classinterface class解除了接口与实现的耦合关系

1.9K60

封装、继承、多态、重载:C++中的强大特性与代码设计

这里写目录标题 封装 C语言封装风格 C++封装 继承 多态 多态的实现 虚函数概念: 虚表指针 overload overwrite override 抽象 重载 封装 C++中的封装是一种面向对象编程的概念...C++封装 C++的封装认为C语言的封装不彻底,对于数据行为分类,没有权限控制。 C++则提供控制选择,将数据行为放在一起,对内开放数据,逻辑抽象。...继承 C++中的继承是面向对象编程的一个重要概念,它允许一个(派生/子类)从另一个(基/父)继承属性行为。...旧被称为基或者父,新被称为派生或者子类。 多态 C++中的多态是面向对象编程的一个重要概念,它允许使用指针或引用来处理不同类型的对象,而实际上执行的是根据对象类型动态选择的相关操作。...对于暂时无法实现的函数,可以声明为纯虚函数,留给派生去实现 注意: 抽象只能作为基使用 不能声明抽象的对象,可以使用抽象指针引用 构造函数不能是虚函数,析构函数可以是虚函数 可以试用指向抽象指针支持运行时多态

13210

《Effective C++》学习笔记

条款17:以独立语句将newed对象置入智能指针 如果有函数参数接收智能指针对象,那么该智能指针对象一定要在调用该函数前用独立语句去创建,否则在创建所指对象用该对象绑定智能指针两个操作之间,可能插入一些操作...(由于C++的独特性),这时候如果出异常,那么会造成创建的对象还没来得及用智能指针修饰,也就无法被自动回收了。...虚继承会增加大小、速度、初始化(及赋值)复杂度等成本,如果虚基不带任何数据,将是最具使用价值的情况。 模板与泛型编程 条款41:了解隐式接口编译期多态 模板都支持接口多态。...条款45:运用成员函数模板接受所有兼容类型 真实指针允许父指针指向子类对象,如果想要让自制的智能指针也支持这种对象转换,那就需要特殊操作,因为一般的模板智能指针能指向多种对象,必然是模板)只能以自身模板声明的类型来构造...这样就能使用一种类型特化出的自制智能指针来构造另一种类型特化出的自制智能指针了。同时,在初始化列表中编译器会为你检查是否允许该类型转换(比如只允许子类往父的转换,不能相反)。

1.1K20

硬核 | C++ 基础大全

然后使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个,当超出了的作用域是,会自动调用析构函数,析构函数会自动释放资源。...除了基本数据类型之外,其余的都作为对象,对象将数据方法结合起来,把它们封装在中,这样每个对象都可以实现自己的特点行为。Java 中取消了 C++ 中的 struct union 。...如何避免使用指针?在平时的编码中,养成在定义指针后且在使用之前完成初始化的习惯或者使用智能指针。 说一下 const 修饰指针如何区分?...接口继承:接口继承是指仅使用属性方法的名称、但是子类必需提供实现的能力。 所谓多态 就是向不同的对象发送同一个消息,不同对象在接收时会产生不同的行为(即方法)。即一个接口,可以实现多种方法。...动态联编对成员函数的选择是基于对象的类型,针对不同的对象类型将做出不同的编译结果。 C++中一般情况下的联编是静态联编,但是当涉及到多态虚函数时应该使用动态联编。

1.1K10

C++多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的没有定义虚函数的大小 )

对比 定义了 虚函数 的 与 没有定义虚函数的 的大小 , 其它成员都相同 , 定义了虚函数的多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 虚函数表...存储到 " 虚函数表 " 中 ; 虚函数表 创建 : 在 使用 virtual 关键字 声明 虚函数 时 , C++ 编译器 会自动为该类生成 " 虚函数表 " ; 生成虚函数表的前提是 至少有...虚函数指针 : " 虚函数表 " 是 存储 " 成员函数指针 " 的 数据结构 , 是一个 函数指针数组 , 数组中的元素都是函数指针 , 具体存储的都是 指向 中的虚函数 的指针 ; 如果 子类...会生成 虚函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码时 , 会自动为该类 添加 一个 vptr 指针 成员变量 , 该指针 会指向 虚函数表...中定义了 虚函数 virtual void fun(int a) ; 在 Parent2 中定义的是 普通函数 void fun(int a) ; 使用 sizeof 函数 , 获取这两个的大小 ,

17440

C++多态与虚函数

所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。 多态可以分为编译时的多态运行时的多态。...C++ 多态实例 程序运行时的动态即动态多态性,这里要研究的问题是:当一个基被继承为不同的派生时,各派生可以使用与基成员相同的成员名,如果在运行时用同一个成员名调用对象的成员,会调用哪个派生成员...,那么就应该使用派生成员变量成员函数,但是程序运行结果却告诉我们,当基指针 p 指向派生 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数,导致输出结果不伦不类...C++ 多态总结 有了虚函数,基指针指向基对象时就使用成员(包括成员函数成员变量),指向派生对象时就使用派生成员。...C++ 提供多态的目的是:可以通过基指针对所有派生(包括直接派生间接派生)的成员变量成员函数进行“全方位”的访问,尤其是成员函数,从而实现一个接口,多种方法。

26520

【笔记】《Effective C++》条款26-55

protected NVI手法还可以进一步扩展为实现策略设计模式的函数指针方法, 使用函数指针来替代虚函数, 这让我们可以动态改变每个对象的某个行为 但是仅用函数指针还是太笨拙了, 使用标准库的模板std..., 只重载一样名称与参数有关, 所以很容易二义 更复杂的情况是下图的"菱形继承": 菱形继承中, 对于不同基都拥有的同名成员, C++默认会复制多份以供使用, 如果不希望复制就应该使用虚继承,..., 因此我们无法直接在模板中调用模板化的基成员 有三种方法处理这个问题: 在调用基函数前加上this指针this->foo();, 用指针进行多态调用 用using声明式using Base<Tmp...45 运用成员函数模板接受所有兼容类型 模板之间并没有什么类似继承关系的固有关系, 无法自动在继承之间进行隐式转换, 智能指针通过底层的转型来模拟这种关系 方法是编写用于指针间类型转换的构造模板,...称为成员函数模板(member function template) 智能指针编写了非explicit的构造函数, 在自身底层是T类型的指针时, 接受一个U类型的指针作为构造函数的参数, 然后通过原始指针本身的转换继承形式将

87630

计算机考研复试C语言常见面试题「建议收藏」

+C的区别 2 3、Java的方法重载 2 4、重写重载 2 5、面向对象编程 3 6、c++可以有多个父 3 7、指针与引用 4 8、structclass的区别(C++) 4 9、c++模板...为什么C++默认的析构函数不是虚函数 8 17、函数指针 9 18、fork函数 9 19、构造析构顺序 9 20、静态函数虚函数的区别 10 21、静态多态与动态多态 10 22、const修饰普通函数与成员函数的目的...对一个成员变量成员函数来说,加了static关键字,则此变量/函数就没有了this指针了,必须通过名才能访问。...) 引用初始化后不能再引用其他对象 8、structclass的区别(C++) 共同点:structclass都可以定义成员函数,都具有继承、多态。...使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个,当超出了的作用域时,会自动调用析构函数,析构函数会自动释放资源。

1.5K30

多态实现-虚函数、函数指针以及变体

今天,借助本文,我们就聊聊动态多态的几种实现方式,当然,项目中不一定要用到,但总归还是要了解的。 概念 自我们接触C++开始,就提到了C++的三大特性封装、继承多态。...基的引用或者指针指向一个派生对象,当该基变量调用该函数时候,会自动调用派生的函数,这就是所谓的动态多态。...,我们知道编译器是通过虚函数表来实现运行时多态操作的,那么对于普通的成员函数成员函数,编译器的行为有什么区别呢?...,编译器在调用虚函数的时候,多了一次通过虚函数表来获取函数地址的操作,其他的则与普通成员函数操作类似(包括将对象指针作为函数参数等操作)。...一个派生Derived,这俩均有一个非virtual的成员函数Print()。

86520

一步步分析-C语言如何面向对象编程

C++语言把数据算法封装在一起,形成一个整体,无论是对它的属性进行操作、还是对它的行为进行调用,都是通过一个对象来执行,这就是面向对象编程思想。...第二个问题:继承 继承描述的是对象之间的关系,子类通过继承父,自动拥有父中的属性行为(也就是方法)。...第三个问题:多态 按字面理解,多态就是“多种状态”,描述的是一种动态的行为。...在C++中,只有通过基引用或者指针,去调用虚函数的时候才发生多态,也就是说多态是发生在运行期间的,C++内部通过一个虚表来实现多态。那么在C语言中,我们也可以按照这个思路来实现。...子类在继承父之后,在内存中又会开辟一块空间来放置子类自己的虚表,然后让继承而来的虚表指针指向子类自己的虚表。 ? 既然C++是这么做的,那我们就用C来手动模拟这个行为:创建虚表虚表指针。 1.

81320

C++复习大全(各种知识点)

,对那种资源而言,像 auto_ptr tr1::shared_ptr 这样的智能指针往往不适合作为资源掌管者,因此有时候我们需要自己建立资源管理假设我们使用 C API 函数处理类型为 Mutex...,所以资源的拷贝行为决定了RAII对象的拷贝行为  普遍儿常见的RAII class copying 行为是:抑制拷贝行为,施行引用计数法  条款 16 : 成对使用 new delete 时要采取相同形式...C++虚函数,抽象基,动态绑定多态构成了出色的动态特性。  虚函数  如果一个的一个函数被声明为虚函数,那么其派生的对应函数也自动成为虚函数,这样一级级传递下去。...C++通过命名技术把每一个成员函数都转换成了名字唯一的全局函数,并把通过对象,指针引用对每一个成员函数的调用语句改写成相应的全局函数调用语句。...需要了解的是,不同的C++编译器对class的数据成员成员函数全局函数等的命名方案是不同的,这是造成不同编译器之间存在二进制连接兼容性的主要原因之一  C++如何处理静态成员  在C++中,凡是使用

98220

C++编程基础与高级编程

指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 面向对象编程 对象、实例 继承:当一个对象获取父对象的所有属性行为,称为继承。...2.static 可以是字段,方法,构造函数,,属性,操作符事件。 2.1 静态成员是属于整个,不属于某一个对象。 3.结构体(struct)用于创建的实例的蓝图。...4.友元函数可以访问的protectedprivate数据。 C++ 继承 1.继承是一个对象自动获取父对象的所有属性行为的过程。派生为子类。 2. ?...C++ 多态 C++的主要特性是封装继承多态 C++重载 如果创建两个多个成员函数具有相同的名称,但是参数的数量类型不同,则成为C++重载。...在C++中,如果派生定义了与其基中定义的函数相同,则称函数重写。 C++虚函数是基中的一个成员函数,您可以在派生中重新定义它。 它声明使用virtual关键字。

1.9K30

C语言与C++面试知识总结

+ C 实现 C++ 的面向对象特性(封装、继承、多态) 封装:使用函数指针把属性与方法封装到结构体中 继承:结构体嵌套 多态:父与子类方法的函数指针不同 explicit(显式)关键字 explicit...智能指针 C++ 标准库(STL)中 头文件:#include C++ 98 std::auto_ptr ps (new std::string(str))...多个智能指针指向相同对象,该对象其相关资源会在 “最后一个 reference 被销毁” 时被释放。...,是一种在异常时可以帮助避免资源泄漏的智能指针。...type_id 返回一个 type_info 对象的引用 如果想通过基指针获得派生的数据类型,基必须带有虚函数 只能获取对象的实际类型 type_info type_info 描述编译器在程序中生成的类型信息

4.9K41

基础知识_Cpp

编译时多态是怎样的 2.5. 成员的权限控制 2.6. structclass的区别 2.7. Cpp中如何禁止一个创建对象 2.8. 如何限制只能在堆或栈上创建对象 2.9....虚函数是实现运行时多态的一种机制,比如两个父指针分别指向子类A子类B的实例,父指针调用虚函数时,会根据不同的子类来调用不同的函数。...对事物进行抽象,将通用的特征放到基,根据不同事物的分化,实现不同的子类。 多态。分为编译时多态运行时多态。编译时多态通过模板函数重载实现,运行时多态通过虚函数实现。...可以这样使用: shared_ptr p1=std::make_shared(1024); process(p1); 2.智能指针内部有一个get()函数,可以获取到原生指针。...实现一个shared_ptr智能指针 000000 参考:技术: C++ 智能指针实现 shared_ptr的线程安全性 C++11的四种强制类型转换 1.static_case(静态转换) 主要执行非多态的转换操作

1.9K30
领券