creating and destroying objects in C++

之前只知道C++中创建对象有两种方式:

1. Obj* o=new Obj();

先定义一个对象指针,然偶用new给对象分配空间,此时对象必须显示地用delete使其消亡,否则长占堆区

(new和delete配对 malloc和free配对)

用o->可以访问成员

2. Obj o;

此时已经按照默认的构造函数创建了一个对象,用o.可以访问成员

如果有有参的构造函数,可以用Obj o(name);这种写法来创建一个对象

 

Bruce的《thinking in c++》中有详尽的介绍可以帮助我们理解为什么会有两种定义方式,以及两种定义方式的区别。

首先我们必须明确的一点的是C++的设计思想是高效(control of efficiency),它给用户提供了一种最快的运行方式——将对象置于栈或静态区中。其文中对栈和静态区的定义是:

 The stack is an area in memory that is used directly by the microprocessor to store data during program execution.Variables on the stack are sometimes called automatic or scoped variables.(限域变量)

 The static storage area is simply a fixed patch of memory that is allocated before the program begins to run.

这种定义方法的好处是在写代码(可能是编译)的时候就将对象的存储空间和生存周期(lifetime)确定下来以期获得最快的执行速度。

但是却以丧失部分的灵活性为代价,即写代码的时候必须知道对象的数量,对象的生存周期。。。。

 

另一种选择是在堆区动态创建一个对象。在程序运行之前无法知道到底有多少对象。创建一个对象使用new关键字,而必须显示使用delete来消亡对象,否则会有内存泄露的危险。这种方法在堆区动态分配内存显然会降低程序的运行速度。但是使用这种方法是基于一个假设的前提——objects tend to be complicated。

 

插曲:探讨下为什么动态分配内存的定义方法比在栈中定义的方法要慢很多?

总所周知,静态的肯定比动态的要快,程序运行时刻动态分配内存肯定要执行一些算法,而在栈中创建空间确实很简单的,正如Bruce说的Creating storage on the stack is often a single microprocessor instruction to move the stack pointer down, and another to move it back up。

 

另一个问题,如果采用第一种方法,编译器决定该对象的生存周期(一般根据其所在的域确定是全局对象、局部对象。。。),并能够在其生命周期结束的时候自动地销毁它。 而方法2,编译器不会知道其生存周期,掌握其生存周期就是程序员的事情了,所以如果该对象已经完成其使命时不将其显式销毁,程序很复杂,对象非常多的后果将会是memory leak. 在c++中没有garbage collector,所以就对程序员的素质要求更高,现在其实也已经有了针对c++的垃圾回收器,但是毕竟不是内建的,而且垃圾回收器的一个问题就是程序必须能够容忍其存在并在一定的时候占用cpu进行工作。

 

下面以一个简单的例子结束本文:

输出:

defaul

this is o2

this is o3

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值