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的集成过 ...
随机推荐
- hdu2067 小兔的棋盘
小兔的棋盘 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:13029接受的提交内容:6517 问题描述 ...
- day_12 内置函数
1. 内置函数 1.双下划线方法的使用 1.原来it=lst.__iter__() print(it__next__()) 2.现在it=iter(list) print(next(it)) 2. ...
- tp 查询
- 第八章:BOM
/* * bom: * 提供了浏览器接口; * w3c为了把javascript最基本的只是标准化已经将bom的主要方面纳入html5规范*/ console.log(window); !(funct ...
- 转 Python多版本管理-pyenv
#######for linux https://www.cnblogs.com/saneri/p/7642316.html 经常遇到这样的情况: 系统自带的Python是2.x,自己需要Python ...
- spring 事务 @EnableTransactionManagement原理
@EnableXXX原理:注解上有个XXXRegistrar,或通过XXXSelector引入XXXRegistrar,XXXRegistrar实现了 ImportBeanDefinitionRegi ...
- c++ 多线程 0
1.1 何谓并发 最简单和最基本的并发,是指两个或更多独立的活动同时发生. (注意区别于计算机中的并发情况!!!!!!!!!!见下面) 1.1.1 计算机系统中的并发:是指在单个系统里同时执行多个独 ...
- sql查询约束
写作业的时候发现书上竟然找不到查询约束的语句,百度搜了好久的资料,终于查询成功,在这里记录下来 主键约束 SELECT tab.name AS [表名], idx.name AS [主键名称] ...
- python3+Appium自动化11-data数据封装之python读取csv文件
使用背景 实际项目中,我们的测试数据可能存储在一个数据文件中,如txt.excel.csv文件类型.我们可以封装一些方法来读取文件中的数据来实现数据驱动 enumerate()简介 enumerate ...
- js 页面按钮提交后 创建显示loading div 操作完成后 再隐藏或删除 进度div
预期效果: 1.点击Save按钮,创建及显示loading div框 2.Save操作完成后,再删除loading 及弹出提示结果 <html> <head> </hea ...