`
rcfalcon
  • 浏览: 228586 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

大话coding之 危险的拷贝构造函数

 
阅读更多

小A在图书馆借了一本非常好看的书,小B说:“哇!你的书太好看啦!也借我看看吧!”

 

小A说:“没问题啊,咱一起看吧!”

 

然后这本书就放那儿,谁想看就过去拿着看。

 

有一天图书馆管理员说:“小A啊,你赶紧还书啊,到时间了”,于是小A把书还了。

 

第二天小B过来想看书,一看傻眼了,书怎么没了?!尴尬ing

 

===========================================================

 

你的代码中是不是也出现过这种情况呢?——请看如下情况:

 

你的类中有一个成员为指针类型(假设为char* image),它的某个实例a中的该成员指针指向一个图片。

 

新申请个类实例b,

 

b = a;

 

你现在可以调用 b.image 获得该图片了。

 

然后你回收a的内存,一般涉及到指针,大家不想内存泄露都会这样写吧:

 

if(a)

{

  if(a.image) delete a.image;

  delete a;

}

 

问题来了,把a.image回收了,b.image因为是通过拷贝构造函数赋值的,所以b.image也指向a.image指向的地址。回收之后,b.image就为NULL了……

一般我们令 b = a的话,肯定是想构造一份跟a一样的实例,但是如果类中也有指针的话,就会存在多指针怎样回收的问题。

 

实际上如果你一直使用默认的拷贝构造函数的话,实际上类定义就可以理解为如下情形了:

 

class A

{

public:

  ....

  static char* image;

 

private:

  .... 

};

 

所以我们应该重载拷贝构造函数,在里面自己去为新实例的指针申请空间,存放数据。

memcpy( a.image, b.image, sizeof(a.image) );

 

该情况就变成了:

 

 

小B说:“哇!你的书太好看啦!也借我看看吧!”

小A说:“你拿去复印一份吧!”

之后小A把书还了,小B也有得看。

 

 

或者禁止拷贝构造。——如何禁止?

 

把拷贝构造重载写在private里面就行啦!

 

情况变成:

 

小B说:“哇!你的书太好看啦!也借我看看吧!”

小A说:“不行,要看你自己去借,不关我的事!”(好冷血哦)

 

 

所以,当类成员有指针时,一定要记得重载或者禁用拷贝构造函数啊。

 

 

分享到:
评论

相关推荐

    zkeq#Coding#Python-类的构造函数1

    title: Python 类的构造函数tags: [对象和异常]description: 本节课主要学习了类的构造函数类的构造函数类中的一种默认函数,用来将类

    SAP方丈-Coding Block详解x.doc

    《SAP方丈-Coding Block详解》 在IT领域,SAP系统是企业资源规划(ERP)软件的领导者,广泛应用于全球各地的企业中。而Coding Block则是SAP ABAP编程中的一项重要概念,它对于理解SAP编程逻辑、提高代码效率和可...

    Coding Theory The Essentials

    Coding Theory The Essentials

    Google Coding Style C++

    - **拷贝构造函数**: 拷贝构造函数用于创建一个新对象作为现有对象的副本。 - **委托构造函数**: 在 C++11 中引入,允许一个构造函数调用另一个构造函数来完成部分初始化工作。 - **结构体与类**: 结构体通常用于...

    04-Phase-Coding_coding_phase_

    在IT领域,编码是软件开发过程中的核心环节,而"Phase Coding",或者称为"阶段编码",是指在软件开发生命周期中特定阶段进行的编码活动。这一阶段通常发生在需求分析、设计和规划之后,是将设计方案转化为可执行程序...

    zencoding-vim

    插件的"autoload"目录包含了自动加载的函数和脚本,这些脚本在Vim启动时会自动执行,确保Zen Coding功能在需要时能够正确运行。"plugin"目录则包含了具体的插件脚本,这些脚本提供了与Vim交互的命令和映射,使得用户...

    coding4fun控件

    【Coding4Fun控件】是专门为Windows Phone平台开发的一系列扩展控件库,它为开发者提供了许多超越原生Windows Phone SDK的功能和视觉效果,旨在增强应用程序的用户体验和交互性。这个库是由微软开发者社区成员创建并...

    RTL coding style资料包

    OpenCores是一个开源硬件项目社区,其提供的`opencores_coding_guidelines.pdf`文档详细介绍了针对VHDL和Verilog的编码规范。这些指导原则旨在确保代码的一致性和可读性,包括但不限于变量命名规则、注释标准、模块...

    Coding Games in Python

    Each chapter in Coding Games in Python shows how to construct a complete working game in simple numbered steps. The book teaches how to use freely available resources, such as PyGame Zero and Blender,...

    Contrastive Multiview Coding笔记

    Contrastive Multiview Coding笔记 Contrastive Multiview Coding是一种多视图对比学习方法,旨在学习鲁棒、通用的表示形式,该表示形式可以从多个视图中学习到共享的因素,例如物理、几何、语义等。该方法可以扩展...

    zencoding小工具

    这个名为"zencoding小工具"的压缩包文件显然是Zen Coding的一个实现或者扩展,旨在帮助用户快速、便捷地编写代码。下面将详细介绍Zen Coding的核心概念以及如何利用它来提高开发效率。 Zen Coding最初由Dmitry ...

    Range Coding 的 D 实现

    Range Coding 是一种无损数据压缩算法,主要用于编码连续的概率分布。在D语言中实现Range Coding,我们可以深入了解D语言的基础语法、内存管理以及算法设计。以下是对这个话题的详细阐述。 一、Range Coding 算法...

    Alibaba Java Coding GuidelinesIDEA插件

    Alibaba Java Coding Guidelines IDEA插件正是基于这套规范打造的,它集成于IntelliJ IDEA这款强大的Java开发环境之中。安装插件后,IDEA可以在编码过程中实时进行错误和警告提示,帮助开发者及时发现并修正不符合...

    zencoding for EditPlus

    1. **快速创建元素**: ZenCoding允许你输入简短的缩写,如`div>ul>li*3`,它会自动生成如下代码: ``` <li></li> <li></li> <li></li> ``` 2. **嵌套元素**: 通过缩进或使用`>`符号,可以轻松创建嵌套...

    ZenCoding.zip

    这个名为"ZenCoding.zip"的压缩包包含了ZenCoding的核心组件和相关资源,便于用户安装和使用。 ZenCoding的核心功能在于其强大的代码缩写和扩展能力。它允许开发者使用简短的缩写来快速生成复杂的HTML结构,例如...

    Grokking the Coding Interview - Patterns for Coding Questions.zip

    《Grokking the Coding Interview - Patterns for Coding Questions》是一份专为北美算法面试准备的压缩包资源,其中包含了多种常见的编程题目模式。这份资源旨在帮助面试者熟练掌握各种算法和数据结构,以便在面试...

    如何使用Git 和 Coding

    Git和Coding是现代软件开发中不可或缺的工具,用于版本控制和协作。Git是一个分布式版本控制系统,而Coding则是一个集成了代码托管、项目管理、质量管理等功能的云端开发平台。本资源旨在帮助用户熟悉如何安装Git,...

    zen coding插件下载

    在压缩包文件名列表中提到的"zen coding"可能是Zen Coding的安装包或资源文件。安装这个插件后,用户可以享受到Zen Coding提供的各种便捷功能,从而提升编程体验。总的来说,Zen Coding(Emmet)是前端开发者不可或...

    Error Control Coding-Fundamentals and Applications(Pearson 2004 2nd Ed.part07

    Coverage of the fundamentals of coding and the applications of codes to the design of real error control systems. Contains the most recent developments of coded modulation, trellises for codes, soft-...

Global site tag (gtag.js) - Google Analytics