关于编码过程中需要明白的一些琐碎问题

1、  什么是内存泄露?如何避免?如果定位监测内存泄露?如何回收已泄露的内存? 

内存泄露是指:一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloccallocreallocnew等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用freedelete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

分类:

 堆内存泄漏(Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.

系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

如何解决内存泄露?

内存泄露的问题困难在于(1)编译器不能发现这些问题。(2)运行时才能捕获到这些问题,这些错误没有明显的征兆。(3)对于手机终端用户来说尤为困难。

下面从三个方面来解决内存泄露问题:

1)良好的编码习惯,尽量在涉及内存的程序段检测出内存泄露。

malloc/relloc------freenew/new[]-----delete/delete[]GlobalAlloc------GlobalFree

MyPointer * pointerArrey = new MyPointer[100];

其删除形式为:delete []pointerArrey;

(2)重载newdelete

(3)boost中的smart pointer

(4)一些常见的插件工具。

 

内存泄露检测方法:

1、boundsChecker:它是一个run-time错误检测工具,它主要定位程序在运行时期发生的各种错误。它能检测的错误包括:(1)指针操作和内存、资源泄露iyji对指针变量的错误操作。(2)内存操作方面的错误,比如:内存读、写溢出;使用未初始化的内存。(3API函数使用错误。

回收:

可以激活相应内核线程执行内存回收算法:kswapd()内核线程,检查某个内存管理区的空闲页框数是否已低于pages_high值的标高。events内核线程,一个工作者线程,回收位于高速内存缓存中的所有空闲的slab。内存紧缺回收主要函数是try_to_free_pages(),该函数会执行一个循环,按照优先级从12到0,依次调用shrink_caches(),shrink_slab()来回收页面,直到回收至少32个内存页面。网上说的,使用Ps、Kill两个命令检测内存使用情况和进行回收。 

2、  什么是野指针?如何避免?如果出现野指针该如何处理? 

野指针是指:指针指向不可用内存的指针。

避免:

1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。 所以第一,一定要对指针进行初始化
2、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。所以第二,用free或delete释放了内存之后,就应立即将指 针设置为NULL,防止产生“野指针”
3、指针操作超越了变量的作用范围。所以第三,对指针操作必须明确指定变量的作用局部函数范围

第一句assert()如果里面表达式为假,程序会中断。

3、  sockethttp的区别? 

他们不是同一层的协议。socket是针对TCP/UDP编程的接口,我们可以借助它建立TCP连接,并且TCP/UDP属于传输层。HTTP则是属于应用层,建立在TCP/UDP之上。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。 

5、  内存管理机制? 

栈分配:相关代码执行时创建,执行结束后被自动释放。一般存=存放局部变量、函数的参数(从右至左存放)以及下一个函数的入口地址。

堆分配:所谓的动态内存分配,即程序猿手动申请分配的内存mallocreallocnew等申请的结果,结束时调用对应的函数或操作符进行内存释放,否则会造成内存泄露。

静态存储区分配:内存在程序编译的时候就已经分配好如数组(具有明确的长度)、static以及全局变量。 

切记:在手动分配之后最好判断是否分配成功再去初始化对应内存,否则会出错。

 6、

10、socket中connect出错怎么办?(学习就是不断借鉴的过程,在这里可以借鉴下别人的思想)

关于Linux 下的socket错误分析:

http://wenku.baidu.com/link?url=l14JyxKX0BN-1Lhb05KNaoXzyUz8rffh4-a1u2WnrPUWQd3aDjSfD2pLIEeggYUPBdvsXUF1aU26OQb2f50aJZBgcWTI9AFe2r_qyQc0KaK 

还有一个是关于socket 下 的connect函数的解析:

http://blog.csdn.net/flymachine/article/details/7530915


你可能感兴趣的:(关于编码过程中需要明白的一些琐碎问题)