C++ 编程/内存管理技巧
外观
< C++ 编程
您可以根据需要分配/释放每个对象,或者您可以回收您的对象。
这将是最基本的方法。您可以使用 'new' 运算符分配内存。您可以使用 'delete' 运算符释放内存。
此外,C 样式内存管理函数如 malloc、realloc、free 等可用于分配/释放内存。在大多数情况下,最好使用 'new'。
请查看本文后面的自动指针,以促进自动指针的释放。
如果您要反复分配和释放,则最好使用内存池。
使用内存池有几个优点。
- 您可以控制要分配的内存量。例如,您的内存池辅助函数或内存池类可以限制要分配的对象的数量。它们可能会在超过限制时返回 NULL。或者,在多线程应用程序中,它们可以选择等待消费者“返回”一些对象。
- 如果您在一块内存中分配,与逐个分配相比,您可以获得连续的内存。连续内存在缓存命中方面可能更快。
- 您可以更好地控制分配和释放。例如,内存池可以跟踪“借给”其他类的所有内存。它可以提供一个功能,通过单个函数调用释放所有内存。如果您不想担心释放各个对象,而是希望在函数结束时通过一次调用释放所有已使用对象,这将非常有用。
- 您的内存池类可以根据系统的配置动态地执行。例如,在多线程的生产者-消费者模型中,您的内存池类可以选择基于系统中的可用内存来选择合适的缓存大小。
您需要在 C++ 中管理指针。以下是一些提示
- 作为一般规则,每个指针都应指向有效的内存位置,或者应该是 NULL。您应不惜一切代价避免悬空指针。
- 尽可能地,您不应该有多个指针指向同一个内存。如果使用一个指针释放内存,但没有将其他指针设置为 NULL,这可能会导致悬空指针。
- 您应该尝试在同一个位置创建和销毁指针。这使得跟踪您正在分配和释放的内容变得容易。
- 切勿双重释放指针。并且如果指针已经指向有效的内存位置,切勿将指针重新分配到新的内存位置,除非您当然有其他方法来释放旧的内存位置。
- 使用 'new' 或 'malloc' 等分配的每个内存位置都应在您完成使用内存后释放。不释放此内存将被称为内存泄漏。一般来说,即使您知道您不需要太多分配,并且您的程序很快就会结束,防止内存泄漏也是一个好主意。
(《内存管理》一书对此进行了更详细的介绍)。
自动指针现在已弃用(从 C++11 开始)。
自动指针让您不必在完成使用内存位置后释放内存。自动指针是 C++ 标准库的一部分。