c++程序员不可不知的101条经验-检测和定位内存泄漏的技巧

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。

定位内存漏洞的一个比较通用的方法是在关键点对应用程序的内存状态拍快照。CRT(C Runtime )库提供了一种结构类型__CrtMemState,可以用它来存储内存状态的快照。

 

-------------

虚函数无法利用内联化得优势,这是因为内联函数是在“编译器”编译器将调用内联函数的地方用内联函数体的代码代替(内联展开),但是虚函数本质上“运行期”行为,本质上“编译期”编译器无法知道某处的虚函数调用在真正执行的时候会调用到那个具体的实现,因此在“编译期”编译器不会对通过指针或引用调用的虚函数进行内联化。

如果想利用虚函数的“动态绑定”带来的设计优势,那么必须放弃虚函数带来的速度优势。

 

C语言中的函数宏(macro)极其相似,但是它们之间也有本质的区别:

  • 内联是编译期行为,由编译器进行;而宏是预处理期行为 ,其替代展开由预处理器来做。
  • 宏的参数在其宏体内出现两次或两次以上时经常会出现副作用,尤其是当在宏体内对参数进行++操作时,而内联不会。
  • 预处理器不会也不能对宏的参数进行类型检查,而内联是由编译器处理的 ,所以会对内联函数的参数进行类型检查。
  • 宏肯定会被展开,而inline指示的内联函数却只是建议,并不一定会被内联展开。   注:对于一些短小的函数,即使程序员本身并未指定要使用内联,有些编译器也会将其优化成内联。

 

模板和泛型

模板类不是一种实类型,必须等到类型绑定后,才能确定最张类型,所以实例化一个模板时,必须要能够让编译器“看到”在哪里使用了模板,而且必须看到模板确切的 定义,否则不能顺利地产生编译代码。

谨记:  建议选择声明和实现放在同一个头文件中,因为其他两种都各有缺陷。

转载于:https://my.oschina.net/ray1421/blog/628845

你可能感兴趣的:(c++程序员不可不知的101条经验-检测和定位内存泄漏的技巧)