首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++有关问题

2012-04-19 
C++问题。书上有段话:把参数传递给函数有三种方法,一种是值传递,一种是传地址,还有一种是传引用。前者与后两

C++问题。
书上有段话:把参数传递给函数有三种方法,一种是值传递,一种是传地址,还有一种是传引用。前者与后两者不同的地方在于:当使用值传递的时候,会在函数里面生成传递参数的一个副本,这个副本的内容是按位从原始参数那里复制过来的,两者的内容是相同的。当原始参数是一个类的对象时,它也会产生一个对象的副本,不过在这里要注意。一般对象产生时都会触发构造函数的执行,但是在产生对象的副本时却不会这样,这时执行的是对象的复制构造函数。为什么会这样?嗯,一般的构造函数都是会完成一些成员属性初始化的工作,在对象传递给某一函数之前,对象的一些属性可能已经被改变了,如果在产生对象副本的时候再执行对象的构造函数,那么这个对象的属性又再恢复到原始状态,这并不是我们想要的。所以在产生对象副本的时候,构造函数不会被执行,被执行的是一个默认的构造函数。当函数执行完毕要返回的时候,对象副本会执行析构函数,如果你的析构函数是空的话,就不会发生什么问题,但一般的析构函数都是要完成一些清理工作,如释放指针所指向的内存空间。这时候问题就可能要出现了。假如你在构造函数里面为一个指针变量分配了内存,在析构函数里面释放分配给这个指针所指向的内存空间,那么在把对象传递给函数至函数结束返回这一过程会发生什么事情呢?首先有一个对象的副本产生了,这个副本也有一个指针,它和原始对象的指针是指向同块内存空间的。函数返回时,对象的析构函数被执行了,即释放了对象副本里面指针所指向的内存空间,但是这个内存空间对原始对象还是有用的啊,就程序本身而言,这是一个严重的错误。然而错误还没结束,当原始对象也被销毁的时候,析构函数再次执行,对同一块系统动态分配的内存空间释放两次是一个未知的操作,将会产生严重的错误。


最后一句话。。对同一块系统动态分配的内存空间释放两次是一个未知的操作,将会产生严重的错误。。。。什么叫未知的操作?。。。不理解



[解决办法]
就是new之后你delete了两次,会发生什么只有God知道,有时候系统没事,(在第一次Delete后该段内存未被使用或使用了有时候也确实没事),但有时候,你再一次Delete甚至会使程序挂掉…
[解决办法]

探讨
所以在产生对象副本的时候,构造函数不会被执行,被执行的是一个默认的构造函数。

[解决办法]
应该叫做未定义的操作
C/C++标准定义了一系列语法,不符合这些语法的就是未定义的操作
各编译器只保证实现那些符合标准的操作,只保证符合标准的语法编译出来的结果是确定的
未定义的操作可能有各种各样的结果,也许通不过编译也许什么也不做也许直接程序崩溃
[解决办法]
LZ所说的是浅拷贝与深拷贝的问题吧!浅拷贝对于指针变量来说是非常糟糕的!
打个不恰当的比喻吧!小妖拿着瓶子去收孙悟空,如果孙悟空只有一个,那么小妖把悟空给收了,后面的什么天蓬元帅啊什么的就不能和悟空打交道了,在这里也就是不能在使用那个被删除的内存了
如果小妖在去收一次悟空,对不起悟空不存在,然后他就抓狂了!
如果悟空变出来两个,也就有两个悟空,收了一个还有一个,他就有事可干,不会抓狂了,因为悟空还在!
在这里就是深拷贝的问题,深拷贝会在创建一快内存空间,让两个指针指向不同的内存区域,那么执行delete操作就是安全的!说的有点罗嗦了,如果想进一步了解,请看http://pcedu.pconline.com.cn/videoedu/asp/0906/1682266_1.html
范老师讲的比我透彻!

热点排行