C++ new new[]详解
例子是:
#ifndef __PLACEMENT_NEW_INLINE
#define __PLACEMENT_NEW_INLINE
inline void *__cdecl operator new(size_t, void *_P)
{return (_P); }
#if _MSC_VER >= 1200
inline void __cdecl operator delete(void *, void *)
{return; }
#endif
#endif
- A* s = new(p) A(XXX);
A* a = new A;
operator new的三种形式:
| throwing (1) |
void* operator new (std::size_t size) throw (std::bad_alloc); |
|---|---|
| nothrow (2) |
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); |
| placement (3) |
void* operator new (std::size_t size, void* ptr) throw(); |
class A
{
public:
A()
{
std::cout<<"call A constructor"<<std::endl;
}
~A()
{
std::cout<<"call A destructor"<<std::endl;
}
void* operator new(size_t size)
{
std::cout<<"call A::operator new[] size:"<<size<<std::endl;
return malloc(size);
}
void operator delete[](void* p)
{
std::cout<<"call A::operator delete[]"<<std::endl;
free(p);
}
void operator delete(void* p)
{
free(p);
}
};
//cpp
#include <iostream>
#include "A.h"
void* operator new[](size_t size)
{
std::cout<<"call global new[] size: "<<size<<std::endl;
return malloc(size);
}
void operator delete[](void* p)
{
std::cout<<"call global delete[] "<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<"sizeof A "<<sizeof(A)<<std::endl;
A* p1 = new A[];
delete []p1;
system("pause");
return ;
}
void * Time::operator new[](size_t size)//重载new[]()运算符,以分配数组
{ std::cout<<"operator new[]() is called.Object size is "<<size<<std::endl; return malloc(size);//?//在自由存储中分配内存 }
- (size - 4)/(那多出来四字节的值)
#include<iostream>
void* operator new[](size_t size) { std::cout<<"call global new[] size: "<<size<<std::endl; return malloc(size); } class Time { private: int hrs,mins,secs;//时,分,秒 public: Time(int hrs=,int mins=,int secs=);//默认参数的带参构造函数 ~Time();//析构函数 void showTime()const; Time operator ++();//重载前缀递增运算符,++x Time operator ++(int);//重载后缀递增运算法,x++ bool operator ==(const Time &)const;//重载相等性运算符 Time & operator =(const Time &);//重载赋值运算符 void * operator new(size_t size);//重载new()运算符,如:int * pInt=new int(0); void operator delete(void * ptr);//重载delete()运算符,如:delete pInt; void * operator new[](size_t size);//重载new[]()运算符,以分配数组 void operator delete[](void * ptr);//重载delete[]()运算符,以去配数组,释放数组所占内存 }; Time::Time(int hrs,int mins,int secs) { this->hrs=hrs; this->mins=mins; this->secs=secs; std::cout<<"Time类默认参数的带参构造函数 "<<(this->hrs)<<':'<<(this->mins)<<':'<<(this->secs)<<std::endl; } Time::~Time() { std::cout<<"Time类析构函数 "<<(this->hrs)<<':'<<(this->mins)<<':'<<(this->secs)<<std::endl; } void Time::showTime()const { std::cout<<"Time类showTime()const函数 "<<(this->hrs)<<':'<<(this->mins)<<':'<<(this->secs)<<std::endl; } Time Time::operator ++()//重载前缀递增运算符,++x { secs++; if(secs>=) { secs=; mins++; if(mins>=) { mins=; hrs++; if(hrs>=) { hrs=; } } } return Time(hrs,mins,secs);//返回无名临时对象 } Time Time::operator ++(int)//重载后缀递增运算法,x++ { Time temp(hrs,mins,secs);//生成临时对象,并进行初始化 ++secs; if(secs>=) { secs=; mins++; if(mins>=) { mins=; hrs++; if(hrs>=) { hrs=; } } } return temp; } bool Time::operator ==(const Time & aTime)const//重载相等性运算符 { return ((hrs==aTime.hrs)&&(mins==aTime.mins)&&(secs==aTime.secs)); } Time & Time::operator =(const Time & aTime)//重载赋值运算符 { hrs=aTime.hrs; mins=aTime.mins; secs=aTime.secs; std::cout<<"Time类赋值运算符函数 "<<(this->hrs)<<':'<<(this->mins)<<':'<<(this->secs)<<std::endl; return (*this);//返回当前对象的引用 } void * Time::operator new(size_t size)//重载new()运算符,如:int * pInt=new int(); { std::cout<<"operator new() is called.Object size is "<<size<<std::endl; return malloc(size);//?//在自由存储中分配内存 } void Time::operator delete(void * ptr)//重载delete()运算符,如:delete pInt; { std::cout<<"operator delete() is called"<<std::endl; free(ptr);//在自由存储中释放内存 } void * Time::operator new[](size_t size)//重载new[]()运算符,以分配数组 { std::cout<<"operator new[]() is called.Object size is "<<size<<std::endl; return malloc(size);//?//在自由存储中分配内存 } void Time::operator delete[](void * ptr)//重载delete[]()运算符,以去配数组,释放数组所占内存 { std::cout<<"operator delete[]() is called"<<std::endl; free(ptr);//在自由存储中释放内存 } int main() { Time * pTime; pTime=new Time;//重载new()运算符,调用默认构造函数 pTime->showTime(); delete pTime;//重载delete()运算符 pTime=new Time[];//重载new[]()运算符,以分配数组,调用默认构造函数 delete [] pTime;//重载delete[]()运算符,以去配数组,释放数组所占内存 getchar(); return ; }
C++ new new[]详解的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- .NET应用和AEAI CAS集成详解
1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...
随机推荐
- 精简的网站reset和css通用样式库
一.CSS reset body{ line-height:1.4; color:#; font-family:arial; font-size: 12px; } input,textarea,sel ...
- Go语言基础之10--面向对象编程2之方法
一.方法的定义 之前我们学习了结构体(struct),其仅仅是对数据的封装,并没有行为方法,还不是一个完全的面向对象的思路,所以现在我们来学习在结构体的基础上如何去定义一个方法.结构体(类)+方法=完 ...
- Asp.net获取系统信息
[DllImport("kernel32")] public static extern void GlobalMemoryStatus(ref MEMORY_INF ...
- Windows无法启动 VMware Workstation server服务解决方法
Windows无法启动VMware Workstation server服务, 可以通过删除datastores.xml文件来解决. 具体操作步骤如下: 1.在系统盘目录下,找到C:\ProgramD ...
- 23-----BBS论坛
BBS论坛(二十三) 23.添加板块 (1)apps/models class BoardModel(db.Model): __tablename__ = 'board' id = db.Column ...
- 转 深入解析:一主多备DG环境,failover的实现过程详解 以及 11g 容灾库可以在线添加tempfile. 以及 11g 容灾库可以在线添加logile.
https://yq.aliyun.com/articles/229600 核心,就是11g通过datafille_scn 号来追日志,而不是日志序列号来追日志. 加快standby switchov ...
- Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: • Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 • Dialogs:提供了暂停测试执行和从用户的 ...
- @ControllerAdvice 拦截异常并统一处理
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...
- mysql 死锁解决办法
查询表的时候,发现一圈圈转啊转,就是不出来数据,猜测表被锁住 解决办法 : mysql> show processlist ; mysql> kill 4; 说明 : 4为 i ...
- set学习(系统的学习)
set是STL中一种标准关联容器.它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高.set,顾名思义是“集合”的意思,在set中 ...