`
kmplayer
  • 浏览: 498617 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款10:如果你写了一个opertor new,请对应写一个operator delete

 
阅读更多
1,什么时候需要撰写一份自己的new或delete?
多半是为了提高效率,例如对于需要动态配置大量细小空间的程序.
如:
class AirplaneRep{};
class Airplane
{
private:
    AirplaneRep* rep;
};


2,当我们用new配置一个Airplane对象时,实际获得的内存要比一个指针的空间多.
其原因是为了operator new和opertor delete的沟通.
缺省版的operator new可以配置任意大小的内存,同理,缺省版的operator delete应该能够释放由new配置的任意大小的内存.
因此必须通过某种办法让operator delete知道new配置了多少内存.
常用的方法:在new传回的前端"加挂"一些额外数据,说明配置的区块大小.
Airplane* pa=new Airplane;
实际获得的内存如下图所示:



3,我们可以利用每个Airplane对象的大小相同这个事实,为Airplane撰写一个定制的operator new,这样就不在需要对每个动态配置的对象分配记录区域.
常用的方法:
先用默认的new配置一大块内存,然后每一个Airplane所需的内存,便从这个大内存里挖取.
这里不要忘记还要给出定制的operator delete
实例代码:
#include <iostream>
using namespace std ;

class AirplaneRep{};
class Airplane
{
public:
    static void* operator new(size_t size);
    static void operator delete(void* collectObject,size_t size);
private:
    union
    {
        AirplaneRep* rep;
        Airplane* next;
    };
    static const int BLOCK_SIZE;
    static Airplane* headOfFreeList;
};

void* Airplane::operator new(size_t size)
{
    if(size!=sizeof(Airplane))
        return ::operator new(size);
    Airplane* p=headOfFreeList;
    //如果有效,还有内存可以分配
    if(p)
        headOfFreeList=p->next;
    else
    {
        Airplane* newBlock=static_cast<Airplane*>(::operator new(BLOCK_SIZE*sizeof(Airplane)));
        for(int i=0;i<BLOCK_SIZE-1;i++)
            newBlock[i].next=&newBlock[i+1];
        //NULL作为大内存的结束
        newBlock[BLOCK_SIZE-1].next=0;
        p=newBlock; //第一个传回
        headOfFreeList=&newBlock[1];
    }
    return p;
}

void Airplane::operator delete(void* collectObject,size_t size)
{
    if(size==0)
        return; //不执行任何操作
    if(size!=sizeof(Airplane))
    {
        ::operator delete(collectObject);
        return;
    }
    Airplane* collect=static_cast<Airplane*>(collectObject);
    //将回收的区间放在head的前端
    collect->next=headOfFreeList;
    headOfFreeList=collect;

}

Airplane* Airplane::headOfFreeList;//默认为0
const int Airplane::BLOCK_SIZE=512;

class Airplane2
{
private:
    union
    {
        AirplaneRep* rep;
        Airplane* next;
    };
    static const int BLOCK_SIZE;
    static Airplane* headOfFreeList;
};

int main ()
{
    const int cnt=128;
    //对象Airplane定制new
    Airplane* pa[cnt];
    for(int i=0;i<cnt;i++)
        pa[i]=new Airplane();
    cout<<(int)pa[127]-(int)pa[125]<<endl;
    for(int i=0;i<cnt;i++)
        delete pa[i];

    //对象Airplane2系统默认new
    Airplane2* pb[cnt];
    for(int i=0;i<cnt;i++)
        pb[i]=new Airplane2();
    cout<<(int)pb[127]-(int)pb[125]<<endl;
    for(int i=0;i<cnt;i++)
        delete pb[i];

	return 0 ;
}

4,上面new一开始分配了大量的内存,但是delete始终没有释放这块内存.
实际上,这里没有memory leak的问题.
内存泄露的问题是"配置内存后,所有指向该内存的指针都遗失了",这样内存就没有办法归还给内存.
我们的方法每一个大内存被 打破为一个个小内存,然后放置于free list中,执行new从free list中拿走,调用delete时,又会被放回free list中.
可见这些内存总是可以访问到,因此没有内存泄露的问题.
我们可以称这块大的内存为memory pool.
memory leak可能无限扩大,而memory pool的成长绝不会大过申请的内存.
由于一些病理上的行为,我们无需释放这个大的memory pool.
例如:
int main ()
{

    //获得大内存
    Airplane* pa=new Airplane();
    //释放大内存
    delete pa;

    //再次获得大内存
    pa=new Airplane();
    //再次释放
    delete pa;

	return 0 ;
}
  • 大小: 3.8 KB
分享到:
评论

相关推荐

    Redis-Operator:Redis Operator在Kubernetes上创建配置管理Redis集群

    这是一个正在进行的项目。 该项目的目的是简化环境中的部署和操作。 它于2016年在Amadeus内部开始,我们最初将该项目设计为在上运行。 这是我们的Redis-Operator的第二个版本,该版本现在基于Kubernetes ...

    redis-operator:Redis Operator通过Kubernetes上的哨兵自动故障转移创建配置管理高可用性Redis

    使用部署要创建运算符,可以直接使用kubectl创建它: kubectl create -f https://raw.githubusercontent.com/spotahome/redis-operator/master/example/operator/all-redis-operator-resources.yaml这将创建一个名为...

    病人资料管理系统

    (10)在关系模式中inotice中inoticeID为主键,所以在所包含属性inoticeID的函数依赖是一个superkey。所以一定属于BCNF。 二、数据库的概念结构设计 病人资料管理系统的E-R模型 三、数据库的物理结构设计 ...

    operatorfabric-core:主操作员面料程序

    简介OperatorFabric是一个模块化,可扩展的工业强度平台,可用于电力,水和其他公用事业运营。 它旨在通过两种方式促进公用事业的运营活动: 将实时业务事件集中在一个地方,以避免使用多个屏幕/软件。 为此,...

    node-v0.10.13-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    课设毕设基于SSM的高校二手交易平台-LW+PPT+源码可运行.zip

    课设毕设基于SSM的高校二手交易平台--LW+PPT+源码可运行

    软件设计师讲义.md

    软件设计师讲义.md

    时间序列预测,股票方向应用,使用transformer-lstm融合的模型算法

    适用人群 针对有一定机器学习和深度学习背景的专业人士,特别是那些对时间序列预测和Transformer以及LSTM模型有兴趣的人。需要一定的Python知识基础 适用场景 用于处理时间序列数据,尤其是在金融领域,示例是股票价格预测。Transformer模型和LSTM的混合使用表明,代码的目的是利用这两种模型的优势来提高预测准确性。 目标 代码的主要目标是利用Transformer模型和LSTM模型来预测时间序列数据,如股票价格。通过实现这两种模型,代码旨在提供一个强大的工具来进行更准确的时间序列分析和预测。

    Autojs-PJYSDK-泡椒云网络验证-v1.15.zip

    Autojs-PJYSDK-泡椒云网络验证-v1.15.zip

    nodejs-ia32-0.10.20.tgz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Java项目之jspm足球俱乐部网上商城系统(源码 + 说明文档)

    Java项目之jspm足球俱乐部网上商城系统(源码 + 说明文档) 第二章 技术介绍 5 2.1 结构简介 5 2.2MySQL 介绍 5 2.3MySQL环境配置 5 2.4Java语言简介 6 2.5JSP技术 7 2.6 SSM框架 7 第三章 系统分析与设计 9 3.1系统说明 9 3.2系统可行性分析 9 3.2.1技术可行性 9 3.2.2经济可行性 9 3.2.3操作可行性 10 3.2.4运行可行性 10 3.3系统的设计思想 10 3.4系统功能结构 11 3.5系统流程分析 12 3.5.1操作流程 12 3.5.2添加信息流程 13 3.5.3删除信息流程 14 第四章 数据库设计 15 4.1数据库概念设计 15 4.2数据表设计 16 第五章 系统的详细设计 23 5.1系统首页的设计 23 5.2后台功能模块 25 5.2.1管理员功能模块 25 5.2.2用户功能模块 27 第六章 系统测试 29 6.1系统测试方法 29 6.2系统功能测试 29

    2024年第九届数维杯数学建模挑战赛题目.rar

    2024年第九届数维杯数学建模挑战赛题目.rar

    springboot(火车站订票管理系统)

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg

    springboot(英语知识应用网站)

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg

    node-v0.8.27-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.11.7-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    Java面向对象综合实验,实现拼图游戏.zip

    游戏的最终成品展示,然后再一步一步的从0开始,完成游戏里面每一个细节。 游戏运行之后,就是这样的界面。 刚开始打开,是登录页面,因为是第一次运行,需要注册。点击注册就会跳转到注册页面 在注册页面我们可以注册账号,用户名如果已存在则会注册失败。 在游戏主界面中,我们可以利用上下左右移动小图片去玩游戏,还有快捷键A可以查看最终效果,W一键通关。 我们在写游戏的时候,也是一部分一部分完成的。 先写游戏主界面,实现步骤如下: 1,完成最外层窗体的搭建。 2,再把菜单添加到窗体当中。 3,把小图片添加到窗体当中。 4,打乱数字图片的顺序。 5,让数字图片可以移动起来。 6,通关之后的胜利判断。 7,添加其他额外的功能。

    学位英语复习资料 学位英语复习资料

    学位英语复习资料

    1plusx_1_proj_test_231125_答案.zip

    1plusx_1_proj_test_231125_答案.zip

Global site tag (gtag.js) - Google Analytics