程序使用动态内存处于以下三种原因之一:
使用原因 | 使用案例 |
---|---|
程序不知道自己需要使用多少对象 | 容器类是出于第一种原因而使用动态内存的典型例子 |
程序不知道所需对象的准确类型 | 面向对象程序设计是出于第二种原因而使用动态内存的例子 |
程序需要在多个对象间共享数据 | 让多个对象能共享相同的底层数据 |
使用 new 和 delete 管理动态内存存在三个常见问题
- 忘记 delete 内存。忘记释放动态内存会导致”内存泄漏“问题,因为这种内存永远不可能被归还给自由空间了。查找内存泄漏错误是非常困难的,因为通常应用程序运行很长时间后,真正耗尽内存时,才能检测到这种错误。
- 使用已经释放掉的对象。通过在释放内存后将指针置为空,有时可以检测出这种错误。
- 同一块内存释放两次。当有两个指针指向相同的动态分配对象时,可能发生这种错误。如果对其中一个指针进行了 delete 操作,对象的内存就被归还给自由空间了。如果我们随后又 delete 第二个指针,自由空间就可能被破坏。
坚持只使用智能指针,就可以避免所有这些问题。对于一块内存,只有在没有任何智能指针指向它的情况下,智能指针才会自动释放它。