这个函数动态地分配一个整数,但从未使用删除释放它。因为指针和普通变量遵循相同的规则,函数结束时,pnValue会超出范围。因为pnValue是唯一的变量的地址动态分配的整数,pnValue摧毁时不再有动态分配的内存引用。这就是所谓的内存泄漏。因此,动态分配的整数不能被删除,从而不能重新分配或重用。内存泄漏耗尽空闲内存在程序运行时,不仅使更少的内存可用这个程序,但其他程序。项目与严重的内存泄漏问题可以吃所有可用的内存,导致整个机器运行缓慢,甚至崩溃。
也能引起内存泄漏,如果动态分配的内存的指针的地址重新分配到另一个值:
1
2
3
|
int
nValue = 5;
int
*pnValue =
new
int
;
pnValue = &nValue;
// old address lost, memory leak results
|
1
2
|
int
*pnValue =
new
int
;
pnValue =
new
int
;
// old address lost, memory leak results
|
从第二个返回的地址分配覆盖第一个的地址分配。因此,第一个分配成为一个内存泄漏!
空指针(第二部分)
空指针(指针地址0)在处理动态内存分配时尤其有用。一个空指针基本上是说“没有被分配内存”。这让我们做事像有条件地分配内存:
1
2
3
|
// If pnValue isn't already allocated, allocate it
if
(!pnValue)
pnValue =
new
int
;
|