论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);

这样一个简单的符号,解决多行代码和程序效率的问题,很是值得学习,这里也渐渐明白引用的功效了。(大牛看到次肯定会“呵呵”,哎,希望从这些点点滴滴开始积累,做个基础扎实的“程序猿”)




0 0
原创粉丝点击