`
rcfalcon
  • 浏览: 234004 次
  • 性别: 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",或者称为"阶段编码",是指在软件开发生命周期中特定阶段进行的编码活动。这一阶段通常发生在需求分析、设计和规划之后,是将设计方案转化为可执行程序...

    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,...

    Alibaba Java Coding Guidelines.zip

    现在网上很多是idea怎么安装Alibaba Java Coding Guidelines插件,myecplise的讲解少之又少而且还不好用,我找了半天终于找到了Alibaba Java Coding Guidelines插件的离线安装包,已经亲测没问题,就跟svn一样用link...

    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的编码规范。这些指导原则旨在确保代码的一致性和可读性,包括但不限于变量命名规则、注释标准、模块...

    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. **嵌套元素**: 通过缩进或使用`>`符号,可以轻松创建嵌套...

    图解网络-小林coding

    图解网络-小林coding

    Contrastive Multiview Coding笔记

    多视图对比学习方法中的一种重要技术——Contrastive Multiview Coding(CMC),在学习数据的鲁棒和通用的表示形式方面表现出色。它通过从多个不同视角捕捉信息,促进了学习过程,这样的视角可以是物理的、几何的、...

    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,...

Global site tag (gtag.js) - Google Analytics