热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

对operatornew调用机制的理解

在effective中meyers提到了怎样定制一个类得自己的operatornew操作符函数:代码类似如下:[codeCC++]void*Myclass::operatornew(

 

在effective中meyers提到了怎样定制一个类得自己的operator new 操作符函数:
代码类似如下:

[code=C/C++]void * Myclass ::operator new(size_t size)
{
new_handle  globalHandle=std::set_new_handle(currentHandle);

void *memory;
try
{
memory=::operator new(size);
}
catch(std::bad_alloc&)
{
std::set_new_handle(globalHandle);
throw;
}

std::set_new_handle(globalHandle);
return memory;
}[/code]

以前我的理解是, 在调用Myclass *pm=new Myclass 的时候,在new操作符内部先调用malloc函数配置内存大小,再调用 类Myclass的默认构造函数。那么我们在对类Mycalss定义自己的operaotr new 操作符的时候,就必须在为它分配等于sizeof(Mycalss)的内存空间之后,再调用它的默认构造函数。但是我在meyers的这个自定义的operator new 里面并没有看到这个对默认构造函数的调用。于是,我猜想在operator new 内部只是简单的调用malloc来返回一个void *指针,而这个对默认构造函数的调用是在对operator new 函数结束之后,由编译器自动进行的,而不是在operaotr new 内部进行的。          

 

结论:当调用语句:Myclass *pm=new Myclass的时候,如果我没有对calss Myclass 定制我自己的oprator new ,那么它就会先调用全局的operator new ,编译器再在这个基础上面调用它的默认构造函数。当我们的类自己定义了operator new 操作符的时候,它就先调用类自己的new,编译器再调用它的默认构造函数。而malloc与new的区别就在于:如果是malloc,那么它简单返回一个指向分配内存的空间的void *指针,如果是new,那么在返回void *指针之后,编译器还会调用相应的类的默认构造函数。其中最重要的是:对默认构造函数的调用不是operator new进行的,而是编译器进行的。

例如:Myclass *pm=new Myclass的时候,它等价于下面的伪c++代码:

void *pm=Myclass::operator::new(sizeof(Myclass));

Myclass::Myclass(pm);
 
推荐阅读
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本文详细介绍了JSP的三大指令:page、include和taglib,重点探讨了静态包含与动态包含的区别及其应用场景,并解释了如何使用taglib指令引入第三方标签库。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入理解Java字符串池机制
    本文详细解析了Java中的字符串池(String Pool)机制,探讨其工作原理、实现方式及其对性能的影响。通过具体的代码示例和分析,帮助读者更好地理解和应用这一重要特性。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 华为智慧屏:超越屏幕尺寸的智能进化
    继全球发布后,华为智慧屏于9月26日在上海正式亮相,推出65英寸和75英寸版本。该产品不仅在屏幕尺寸上有所突破,更在性能和智能化方面实现了显著提升。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 本文详细介绍了8051系列微控制器的中断系统,特别是C51编译器中interrupt和using关键字的作用及其使用方法。通过深入分析这两个关键字的功能,帮助开发者更好地理解和优化中断程序的设计。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文探讨了浮点数、字符、Kotlin类型转换以及字符串处理等关键概念。介绍了Float.MIN_VALUE表示最小正数,Float.NaN的特殊性质,以及Double.MIN_VALUE和Char类型的细节。同时,解释了Kotlin中的类型转换、字符串拼接及编译期常量的概念。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
author-avatar
手机用户2502898521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有