动态分配内存的三个函数
- malloc:在堆中获取内存
- calloc:分配清零后的内存
- realloc:改变一个指针所指向的内存块的大小
堆经常会出现两种类型的问题
- 释放或改写仍在使用的内存(称为“内存损坏”)
- 未释放不再使用的内存(称为“内存泄漏”)
内存泄漏
内存泄漏定义:一种稀有资源正被一个进程榨干。主要症状就是速度会变慢。
检测内存泄漏:
- 1使用swap命令观察还有多少可用的交换空间。在一分钟内键入三四次,如果发现不断有内存被分配且不释放,一个可能的解释是有个进程出现了泄漏。
- 2确定可疑的进程。可以使用pa -la 用户名命令显示所有进程的大小。数次重复这个命令,如果发现有一个进程不断增加从不减少,他可能出现了内存泄漏。
最简单的内存泄漏形式:
for (i = 0; i<10; i++) p=malloc(1024);
在所有的网络检测工具中,最神奇的莫过于 snoop了
snoop是SVr4中 etherfind的替代品,它从网络中捕捉分组(packet),并在你的工作站上显示。你可以告诉 Snoop只把精力集中于一至两台机器,也就是你自己的工作站和服务器,这对于检测连接故障非常有用—snoop甚至可以告诉你字节数据正从你的机器中发出。
但snoop最好的特性就是它的-a选项。它可以使 snoop让每个分组都在工作站的扬声器中输出一个滴答声,你可以聆听网络的以太交通。不同的分组长度具有不同的调幅,如果你习惯于使用 snoop-a,你会对那些特征声音了如指掌,可以凭借“耳朵”来检测并优化网络。
总线错误和段错误
当硬件告诉操作系统一个有问题的内存引用时,就会出现这两种错误。操作系统通过向出错的进程发送一个信号与之交流。
信号就是一种事件通知或一个软件中断,是由于硬件中断而产生的。
总线错误几乎都是由于未对齐的读或写引起的。因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。
段错误是由于内存管理单元(负责支持虚拟内存的硬件)的异常所致,该异常通常是由于解除引用一个未初始化或非法值的指针引起的。
- 1坏指针值错误:在指针赋值前就用它来引用内存,或向库函数传送一个坏指针。
- 2改写错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些管理数据结构。
- 3指针释放引起的错误:释放同一个内存块两次,释放未使用malloc分配的内存,或释放使用中的内存,或释放一个无效的指针。