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的集成过 ...
随机推荐
- Django 想要单独执行文件
Django 单独文件执行 文件 我是在项目根目录文件创建的. 配置文件: #!/usr/bin/env python import os import sys if __name__ == & ...
- my14_mysql指定时间恢复之模拟从库
场景 *********************************线上库数据误删除,存在几天前的一份全备数据,现需要恢复这些误删除的数据本例方案:在另外一台服务器上,恢复全备,搭建binlog ...
- 移动测试之appium+python 导出报告(六)
下载 HTMLTestRunner.py python3可以参考这个地址 这是针对Python2.7版本 test.py from appium import webdriver import tim ...
- python 运算符-赋值运算
结果是值 算数运算: a = 10 * 10 赋值运算: a = a + 1 a +=1 结果是布尔值 比较运算: a = 1 > 5 逻辑运算: a = 1 > 6 or 1= ...
- 大数据 Big Data howto
The Fourth Paradigm: Data-Intensive Scientific Discovery http://research.microsoft.com/en-us/collabo ...
- Redis Intro - Dict
https://segmentfault.com/a/1190000004850844
- 卸载3DSMAX
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- Mongodb installation & userguide
1.Mongodb Installation in Ubuntu (1) Download from: https://www.mongodb.org/downloads File: mongodb- ...
- vs2012配置使用entity framework 6
项目中使用mysql作为数据库,想快速地实现一些数据服务,为了节省开发时间,提升开发效率,性能不是考虑的重点,所以选择了使用ORM框架:Entity Framework.指定了DB的table des ...
- CI模板中php脚本的使用
今天偶然发现,在CI的模板中能够直接使用CI自带的函数,并且可以直接调用controller里面的属性.案例: 控制器: public function test(){ $this->a = ' ...