论C/C++引用的重要性
来源:互联网 发布:windows 97 编辑:程序博客网 时间:2024/04/27 20:42
踏入软件行业已一年有余,感觉自己很菜,一直想把日常遇到的问题,以一种和合适的方式记录下来,以供自勉,偶然和同事聊天,发现博客这玩样,开始中毒,于是“开坛做法”,留待自己闲暇时光温故知新。
今偶遇一问题,让自己顿觉开朗,写下心得(话说这个真心感觉到面试过程中别人问引用之类的问题,很是不理解啊,现在有所领悟)。
表象:
class CGisAdapter
{
INGMapGeo* m_pDemMap;
INGMapGeo* m_pDhmMap;
INGMapGeo* m_pDsmMap;
INGMapGeo* m_pDomMap;
INGMapGeo* m_pPopMap;
INGMapGeo* m_pTopoMap;
bool m_bMorphoNeeded;
CProfile* m_pProfile;
//地图的公有信息
int m_nCoordSys; //起始点坐标的坐标系信息
double m_XLowLeft;
double m_YLowLeft;
double m_Xspacing;
double m_Yspacing; //分辨率,每两个像素点之间的距离;
long m_nWidth;
long m_nHeight;
public:
CGisAdapter(bool bMorphoNeeded=true);
~CGisAdapter();
};
定义这样一个业务类,需要对地图进行一系列处理,使用方式如下:
int Model_PointsAnalysis(CalParams* pCalParams, ScmTRX* pScmTRX, TrxNumInfo strTrxNumInfoNeed, CGisAdapter GisAdapter, CString ResultFileFullName);
UINT ShowFSTCalThread(LPVOID pParam)
{
int nErrorCode = -1;
/*获取地图信息*/
CGisAdapter GisAdapter;
GisAdapter.LoadMaps(CProjectFile::GetProjFileName());
.......//一系列操作
nErrorCode = Model_PointsAnalysis(pCalParams, pScmTRX, strTrxNumInfoNeed, GisAdapter, ResultFileFullName) ;
.......//一系列操作
return 0;
}
在退出ShowFSTCalThread函数时,会调用CGisAdapter类的析构函数,进行相应的内存释放,这里的表象是INGMapGeo* m_pDemMap; INGMapGeo* m_pDhmMap; INGMapGeo* m_pDsmMap; INGMapGeo* m_pDomMap; INGMapGeo* m_pPopMap;在释放这一系列指针时,程序会蹦;我的初始想法是内存重复释放(当然也确实是重复释放了) ;
现在来细细分析下:
当程序走到该行nErrorCode = Model_PointsAnalysis(pCalParams, pScmTRX, strTrxNumInfoNeed, GisAdapter, ResultFileFullName) ;针对GisAdapter这个类对象实际上只是做了一个形参和实参之间的一个浅拷贝;在Model_PointsAnalysis函数中进行处理的实际上是该对象的一个拷贝对象,这个拷贝对象和原始对象中INGMapGeo* m_pDemMap; INGMapGeo* m_pDhmMap; INGMapGeo* m_pDsmMap; INGMapGeo* m_pDomMap; INGMapGeo* m_pPopMap;这些指针指向的地址都是相同的,所以在函数Model_PointsAnalysis结束时释放了一次(析构中释放),在ShowFSTCalThread函数结束时又再次释放了一次(析构中释放),自然引起程序的崩溃。
解决这种问题,我初始想法进行深拷贝,保证形参和实参中GisAdapter对象中的指针不是指向同一地址,这样就不存在重复释放的现象;但回过头一想为啥不用引用的呢,这样两个函数中处理的对象在内存中只有一份,不但不需要进行浅拷贝的动作提高效率,还能保障不会对同一地址多次释放;
int Model_PointsAnalysis(CalParams* pCalParams, ScmTRX* pScmTRX, TrxNumInfo strTrxNumInfoNeed, CGisAdapter& GisAdapter, CString ResultFileFullName);
这样一个简单的符号,解决多行代码和程序效率的问题,很是值得学习,这里也渐渐明白引用的功效了。(大牛看到次肯定会“呵呵”,哎,希望从这些点点滴滴开始积累,做个基础扎实的“程序猿”)
- 论C/C++引用的重要性
- C语言的重要性
- C语言的重要性
- C函数的重要性
- c语言的重要性!
- 【C/C++相关】论程序员写技术博客的重要性
- 论C和C++中main函数的重要性
- 论Makefile的重要性(一)-----Linux C开发
- 论Makefile的重要性(二)-----Linux C开发
- C语言的重要性和特点
- c语言fflush(stdin)的重要性
- 学好C语言的重要性和方法
- C语言函数原型的重要性
- C语言中全局变量初始化的重要性!!!
- C语言中函数原型的重要性
- C语言 - 变量初始化的重要性
- C语言对编程学习的重要性
- C语言重要性
- 加深记忆-JScrollPane主要方法
- 深入理解java虚拟机(三)对象回收判断算法以及死亡过程
- 什么是堆和栈,它们在哪儿?
- 新房装修有异味,8款室内绿植轻松除甲醛
- Android 布局优化
- 论C/C++引用的重要性
- 不是使用C/C++函数如何复制文件到另外一个目录
- 『什么找茬』更新上线 APP STORE
- 新房装修有异味,8款室内绿植轻松除甲醛
- 使用3.0实现微信打飞机——1.游戏开始场景
- hadoop shuffle过程
- 设计模式(一)设计模式遵循的七大原则
- Java的读入
- strcpy,memcpy,memset的用法与区别