1. 首页
  2. 编程语言
  3. C++ 
  4. 重载new和delete-learning ros for robotics programming - second edit...

重载new和delete-learning ros for robotics programming - second edit...

上传者: 2024-07-23 21:44:28上传 PDF文件 14.32MB 热度 6次

12.5 重载 new 和 delete

当创建一个 new 表达式时有两件事发生。使用运算符 new 分配内存,然后调用构造函数。在 delete 表达式里,调用析构函数,然后使用运算符 delete 释放内存。我们永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配函数运算符 new 和 delete。被 new 和 delete 使用的内存分配系统是为通用目的而设计的。但在特殊的情形下,它不能满足我们的需要。改变分配系统的原因是考虑效率:我们也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈。C++ 允许重载 new 和 delete 来实现我们自己的存储分配方案,所以可以像这样处理问题。另外一个问题是堆碎片:分配不同大小的内存可能造成在堆上产生很多碎片,以至于很快用完内存。也就是内存可能还有,但由于是碎片,找不到足够大的内存满足我们的需要。通过为特定类创建我们自己的内存分配器,可以确保这种情况不会发生。

在嵌入和实时系统里,程序可能必须在有限的资源情况下运行很长时间。这样的系统也可能要求分配内存花费相同的时间且不允许出现堆内存耗尽或出现很多碎片的情况。由客户定制的内存分配器是一种解决办法,否则程序设计者在这种情况下要避免使用 new 和 delete,从而失去了 C++ 很有价值的优点。当重载运算符 new 和 delete 时,记住只改变原有的内存分配方法是很重要的。编译器将用 new 代替缺省的版本去分配内存,然后为那个内存调用构造函数。所以,虽然编译器遇到 new 时会分配内存并调用构造函数,但当我们重载 new 时,可以改变的只是内存分配部分。(delete 也有相似的限制。)当重载运算符 new 时,也可以替换它用完内存时的行为,所以必须在运算符 new 里决定做什么:返回 0、写一个调用 new-handler 的循环、再试着分配或用一个 bad_alloc 异常处理(在第17章中讨论)。

重载 new 和 delete 与重载任何其他运算符一样。但可以选择重载全局内存分配函数,或为特定的类使用特定的分配函数。有关重载运算符的更多细节,可以参考以下内容:简介C++编程中的运算符重载详解C++编程中的单目运算符重载与双目运算符重载深入解析C++编程中的运算符重载

12.5.1 重载全局 new 和 delete

当全局版本的 new 和 delete 不能满足整个系统时,对其重载是很极端的方法。如果重载全局......

下载地址
用户评论