一. 概述
内存泄漏一直是软件开发人员最头大的问题之一,尤其像C/C++这样自由度非常大的编程语言,几乎是每一个用其开发出来的软件都会出现内存泄漏的情况。
如果没有内存泄漏,世界或许会变的美好。然而,完全美好的世界是不存在的,我们能做的就是尽量让它变的更美好。
二. 工具介绍
纵观目前市面上有不少内存泄漏工具,在这里就不多做介绍。笔者最常用的是IBM公司出产的IBM Rational Purify,说起Purify这东西,稳定性虽然不怎么样,但功能很强大。它是IBM Rational PurifyPlus产品组中三剑客的一员。
Purify是面向C/C++, VB, Java语言,测试内存错误,Windows API访问错误,COM方法调用情况等。
图1. Purify主界面
Purify对于C/C++的分析支持源代码级,或通过其专利技术:“目标代码插入(Object Code Insertion)”工作在无源代码级。Purify的功能其实非常之强大,此次我们只讨论怎么通过Purify进行C/C++下的内存泄漏发现。在介绍它的工作流程前,我们来认识一下几个缩写术语的意思:
l ABR: Array Bounds Read,数组越界读
l ......
一. 概述
内存泄漏一直是软件开发人员最头大的问题之一,尤其像C/C++这样自由度非常大的编程语言,几乎是每一个用其开发出来的软件都会出现内存泄漏的情况。
如果没有内存泄漏,世界或许会变的美好。然而,完全美好的世界是不存在的,我们能做的就是尽量让它变的更美好。
二. 工具介绍
纵观目前市面上有不少内存泄漏工具,在这里就不多做介绍。笔者最常用的是IBM公司出产的IBM Rational Purify,说起Purify这东西,稳定性虽然不怎么样,但功能很强大。它是IBM Rational PurifyPlus产品组中三剑客的一员。
Purify是面向C/C++, VB, Java语言,测试内存错误,Windows API访问错误,COM方法调用情况等。
图1. Purify主界面
Purify对于C/C++的分析支持源代码级,或通过其专利技术:“目标代码插入(Object Code Insertion)”工作在无源代码级。Purify的功能其实非常之强大,此次我们只讨论怎么通过Purify进行C/C++下的内存泄漏发现。在介绍它的工作流程前,我们来认识一下几个缩写术语的意思:
l ABR: Array Bounds Read,数组越界读
l ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( ......
#include <iostream>
using namespace std;
void main()
{
char *p,*q;
p = "abcde";
q = p + 3;
*q = 't';
cout<<p<<endl;
cout<<q<<endl;
}
两种语言编译都可以通过
当执行到
*q = 't';
时,C++程序出现内存访问错误,C程序可以运行,并且把第四个内存单元置换为t
C++编译器在编译过程中,给"abcde"分配了常量区的内存单元,常量区的内存单元在运行时无法修改,因此试图对常量区的操作会产生异常。
......
#include <iostream>
using namespace std;
void main()
{
char *p,*q;
p = "abcde";
q = p + 3;
*q = 't';
cout<<p<<endl;
cout<<q<<endl;
}
两种语言编译都可以通过
当执行到
*q = 't';
时,C++程序出现内存访问错误,C程序可以运行,并且把第四个内存单元置换为t
C++编译器在编译过程中,给"abcde"分配了常量区的内存单元,常量区的内存单元在运行时无法修改,因此试图对常量区的操作会产生异常。
......
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C。
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
2、学习C的过程中,一定要理解结构化编程思维。
为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。
这是现代工程化开发的核心和灵魂。
因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp ......
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C。
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
2、学习C的过程中,一定要理解结构化编程思维。
为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。
这是现代工程化开发的核心和灵魂。
因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp ......
回顾之前的篇幅,C语言的主体部分基本已经介绍完了。之所以没有介绍C++的相关特性是因为在之前的文章中C和C++在这些方面都有共性,所以在面向对象之前。我们先把这些共性给介绍完。也就是说在介绍面向对象之前,所有的文章都是CC++中都能使用的。从这点上来看,现在正极力奋斗于C++战线上的初学者还是很有用处的。
本篇继续沿着这条路线,到本篇为止包括本篇都还不会急于去介绍C++的面向对象的特性。那么在之前的文章中,可以说基本都把内容给介绍完了。本篇虽然不是大概念,但是在实际的项目中是绝对离不开的。那么我们就在本篇开始我们的位运算旅程。
首先,位运算到底用来做什么,用处多不,好像到现在我也没有怎么用位运算呢?很多初学者我相信会有这样的疑问。那么本篇就将介绍位运算的强大用途及无限魅力。
位运算跟二进制联系非常紧密,二进制这个概念相信大家都不陌生,我们的位运算也就是在这些0或1上进行操作。不要说二进制你都不知道。比如:
7的8位二进制为: 0000 0111
7的32位二进制为: 0000 0000 0000 0000 0000 0000 0000 0111
二进制与十进制的换算我就不说了。上面为什么三个1就表示7,不知道的话就看看书哈。
上面说到了8位和32位,我们知道一个 ......
回顾之前的篇幅,C语言的主体部分基本已经介绍完了。之所以没有介绍C++的相关特性是因为在之前的文章中C和C++在这些方面都有共性,所以在面向对象之前。我们先把这些共性给介绍完。也就是说在介绍面向对象之前,所有的文章都是CC++中都能使用的。从这点上来看,现在正极力奋斗于C++战线上的初学者还是很有用处的。
本篇继续沿着这条路线,到本篇为止包括本篇都还不会急于去介绍C++的面向对象的特性。那么在之前的文章中,可以说基本都把内容给介绍完了。本篇虽然不是大概念,但是在实际的项目中是绝对离不开的。那么我们就在本篇开始我们的位运算旅程。
首先,位运算到底用来做什么,用处多不,好像到现在我也没有怎么用位运算呢?很多初学者我相信会有这样的疑问。那么本篇就将介绍位运算的强大用途及无限魅力。
位运算跟二进制联系非常紧密,二进制这个概念相信大家都不陌生,我们的位运算也就是在这些0或1上进行操作。不要说二进制你都不知道。比如:
7的8位二进制为: 0000 0111
7的32位二进制为: 0000 0000 0000 0000 0000 0000 0000 0111
二进制与十进制的换算我就不说了。上面为什么三个1就表示7,不知道的话就看看书哈。
上面说到了8位和32位,我们知道一个 ......
C/S模式和B/S模式的区别
。。。。。。。。。。。。。。。。。。。。。。。。。。。
~~什么是B/S模式
B/S模式,即浏览器/服务器模式,是一种从传统的二层CS模式发展起来的新的网络结构模式,其本质是三层结构C/S模式。B/S网络结构模式是基于Intranet的需求而出现并发展的。
~~B/S模式的工作原理
在B/S模式中,客户端运行浏览器软件。浏览器以超文本形式向Web服务器提出访问数据库的要求,Web服务器接受客户端请求后,将这个请求转化为SQL语法,并交给数据库服务器,数据库服务器得到请求后,验证其合法性,并进行数据处理,然后将处理后的结果返回给Web服务器,Web服务器再一次将得到的所有结果进行转化,变成HTML文档形式,转发给客户端浏览器以友好的Web页面形式显示出来。
~~B/S模式的特点
系统开发、维护和升级的经济性:对于大型的管理信息系统,软件开发、维护与升级的费用是非常高的,BS模式所具有的框架结构可以大大节省这些费用,同时,BS模式对前台客户机的要求并不高,可以避免盲目进行硬件升级造成的巨大浪费。 ......