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的集成过 ...
随机推荐
- Kibana 视图开发入门参考文档
官方教程:https://www.elastic.co/blog/developing-new-kibana-visualizations GitHub源码:https://github.com/el ...
- P1147 连续自然数和(思维题)
题目描述 对一个给定的自然数MM,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为MM. 例子:1998+1999+2000+2001+2002 = 100001998+1999+2000 ...
- 求js数组的最大值和最小值
数组 ,,,,,,,,,]; 方法1 - 字符串拼接法 利用toString或join把数组转换为字符串,再和Math的max和min方法分别进行拼接,最后执行eval方法 var max = eva ...
- 修改阿里云ESC Centos 7.4 防火墙开放端口
例如系统:Centos 7.4操作如下 1,进入 cd /etc/firewalld/zones/ 目录 2,编辑 vim public.xml 3,按i或insert键进入编辑模式 4,在<z ...
- 关于 java中的SecureRandom在linux中每次生成不同结果
使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密 public static String encrypt(String content, ...
- html样式
<!doctype html> <html> <head> <style id="mceDefaultStyles" type=" ...
- Python APIs
NDArray API Python API速查
- cout和printf不能混用
1.两者的缓存机制不同:printf无缓冲区,而std::cout有 (其实printf也是有缓冲区的,https://blog.csdn.net/ithzhang/article/details/6 ...
- 性能测试工具Jmeter08-Jmeter断言(检查点)
断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性. 下面介绍常用的jmeter三种断言 1.响应断言 例如: 模式匹配规则 2.Size A ...
- http学习总结及思考
针对前面几章的学习,加上在学长的指导下,希望对前面知识进行简单总结. 1.在报文的7个方法中,最常用的是:Head和Post 响应头:If-Modified-Since HEAD -> 服务器返 ...