课程项目:Sirus之内存追踪程序所遇问题及解决

来源:互联网 发布:新东方四级怎么样知乎 编辑:程序博客网 时间:2024/06/03 20:55

      鏖战了4个小时,终于依照 原示例程序网址:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml 的方法解决了内存泄露追踪程序的撰写(C++刚开始自学,各种不熟悉……)。 在这个过程中,我遇到了很多的问题,有的有关C++,有的有关VS的使用,还有的就跟编译程序的实现原理有点关系,幸运的是最后都通过google一一解决了(不得不说google实在太强大,dream company)。

 

      时间不多,废话少说,把今天的问题以及解决的方法详细记录一下,以备以后查阅!

 

问题一:definitions and declaraions

      很多时候写一个工程我们往往把definition,如struct, int 以及 function bodies(函数体)放在.cpp文件中,而declarations, such as typedef, extern and function protoptypes 将放到.h文件中。当然有的时候也会把function bodies放在.h文件中,比如我写矩阵或向量运算的时候喜欢那么干,原因??(这个Mark一下我自己回去查了补充)。但是这次我在写这个memory tracker的时候,几乎所有bodies放到了.h文件中,这时产生了链接错误 ‘LNK2008:....already defined in ....’, 通过一顿search, 知道了其中的原因:重复编译导致包含我这个文件的其他文件生成的obj文件都会有相同目标码,这就是原因,尽管我用了#pragma once防止在相同的cpp文件中多次包含头文件,但是目标码都会生成一次。所以解决的方法有二:1、如果非要在.h文件中写函数体,则可以将它设为inline或static;2、将函数体移到cpp中。

问题二:宏定义CAESAR_NEW instead default new

      这个问题困扰了我比较长的时间,原来的代码如下:

 

 

当我很高兴的准备使用我新重载的new的时候,编译器给我报出了错误信息:error C2661: 'operator new' : no overloaded function takes 3 arguments 瞬间我又崩溃了…… 又是一顿漫长的搜索和阅读,这个问题我也解决了,原因如下:

#ifdef _DEBUG 到 #endif那段很长的宏定义是导致这个问题的主要原因,当我用new的时候,complier找我的CAESAR_NEW,然后CAESAR_NEW被翻译成DEBUG_NEW成new(__FILE__, __LINE__),最后complier看到就是

void * operaor new( __FILE__, __LINE__ )( size_t, const char* file, int lnum );

所以这个错误就生成了。这种定义法貌似是MFC的产物,因为MFC自己也重载过new,delete之类的,所以如果你自己那么用的话会有问题,方法就是直接使用#define XXX(自己定义) new(__FILE__, __LINE__)就可以了。再有,当你重载的操作符被定义之后,最后就让预编译处理器处于deactive的状态。

 

最后,我发现在做工程之前一定要把你所使用的语言学习的比较透彻,或者你至少应该知道出了错往什么方向去找问题,这个很重要,掌握好了会在以后的项目和工程中提高解决编程语言问题的能力,所以我决定做完之后找个时间好好吃透一门语言,然后在实践中提高自己的水平。 如果有些经验丰富的工程师能在我身边指导我当然更好了~可以啊,目前没有. So I have to depend on mysely, God watch over me!