c++ 关于new文件
new文件用来管理c++的动态内存,这个文件声明了几个全局空间的函数(不是std空间的函数,全局空间的函数调用时是用全局作用域解析符),包括operator new 和operator delete的重载 ,这些函数用于处理动态存储空间请求。
其new的头文件源代码
#ifndef _NEW
#define _NEW #include <cstddef>
#include <exception> extern "C++" { namespace std
{ //注意此空间内函数或者变量处于std空间,使用时需要添加std::调用
/**
* 当内存分配错误的时候抛出bad_alloc异常
*/
class bad_alloc : public exception
{
public:
bad_alloc() throw() { }
virtual ~bad_alloc() throw();
}; //当内存分配失败时用此结构体替代异常,使用嵌入式环境,嵌入式环境没有异常功能
struct nothrow_t { };
extern const nothrow_t nothrow; ///当内存分配失败时,调用new_handler
///new_handler试着去分配更多得存储空间,当且仅当申请内存成功时,才会返
///否则抛出bad_alloc异常或者终止程序(调用abort或者exit)
typedef void (*new_handler)();
new_handler set_new_handler(new_handler) throw();
} // namespace std //全局空间函数,调用时加上作用域解析符,如::operator new ()
void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
void operator delete(void*, const std::nothrow_t&) throw();
void operator delete[](void*, const std::nothrow_t&) throw(); //placement operator new/delete inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; } inline void operator delete (void*, void*) throw() { }
inline void operator delete[](void*, void*) throw() { } } // extern "C++" #endif
1、关于new operator与operator new
operator new() 仅仅分配内存空间,是对malloc的一个封装,返回的是一个void *,如
int* a = (int *)::operator new(sizeof(int));
只是对a分配了空间,通过vs2012进行调试你会发现operator new 的实现如下:其主要是调用malloc(size),而没有对内存进行初始化
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes
void *p;
while ((p = malloc(size)) == )
if (_callnewh(size) == )
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
对于new operator先调用operator new分配内存空间,然后调用构造函数初始化
#include <iostream>
using namespace std; class Foo{
public:
Foo(){
cout<<"Foo constructor"<<endl;
a = ;
} //对operator new进行重写
void* operator new(size_t size){
cout<<"Foo operator new"<<endl;
return ::operator new(size);
} int a;
}; int main(){
Foo* f1 =(Foo *) ::operator new(sizeof(Foo));
cout<<f1->a<<endl;
Foo* f2 = new Foo();
cout<<f2->a<<endl;
} /***************
结果为:
3420040
Foo operator new
Foo constructor
10 *****************/
由于operator new 只是分配空间未调用构造函数,所以公有变量未初始化,是个随机值,
而new Foo() 先调用operator new 然后再构造函数,所以会先出现Foo operator new
2、关于placement new(定位放置new)
placement new 是operator new的一个重载的版本,如果你想在已经分配的内存中创建一个对象,这时不能使用new。而placement new永许你在一个已经分配好的内存中(栈或者堆中)构造一个新的对象,原型中void* p实际就是指向一个已经分配好的内存缓冲区的首地址。c++支持placement operator new,能够在预先分配的缓冲区中构造对象,避免new内存分配时查找内存和分配内存的时间,而且由于内存已经分配,没有内存分配失败的危险,在内存池,垃圾回收器,和性能或异常安全可以使用
char *buf = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi"); // placement new
char memory[sizeof(Foo)];
void* place = memory; Foo* f = new(place) Foo();
3、关于set_new_handler
new_handler类型的函数是默认内存申请函数(operator new和operator new[])申请内存失败,会被调用。
new_handler函数会试图为新的内存申请请求提供更多的可用空间。当且仅当,函数成功地提供了更多的可用空间,它才返回。
否则,要么抛出bad_alloc异常(或bad_alloc派生类)要么终止程序(比如调用abort或exit)。
如果new_handler函数返回(即,它提供了更多可用空间)后,当内存申请函数申请指定的内存空间失败时,它会被再次调用,或直到new_handle函数不返回或被替换。
#include <iostream>
#include <new> char* memoryPool = NULL; void my_new_handler(){
if(NULL != memoryPool){
// 删除一些不用的内存
delete[] memoryPool;
memoryPool = NULL;
}else{
//没有足够的内存
throw std::bad_alloc();
}
return ;
} int main(){
std::set_new_handler(my_new_handler);
memoryPool = new char[**];
if(memoryPool == NULL){
std::cout<<"allocator fail"<<std::endl;
return -;
}
char *p = NULL;
for(int i = ; i < ; ++ i){
p = new char[**];
std::cout<<i+<<" allocator 512M "<<p<<std::endl;
}
return ;
}
c++ 关于new文件的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- CSS学习笔记----CSS3自定义字体图标
响应式网页字体图标 作者:大漠 日期:2014-01-28 点击:3220 @font-face Responsive 本文由大漠根据Jason的<Responsive Webfont Icon ...
- Java集合源码学习(四)HashMap分析
ArrayList.LinkedList和HashMap的源码是一起看的,横向对比吧,感觉对这三种数据结构的理解加深了很多. >>数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据 ...
- Delphi中函数定义和声明的位置
当函数(或过程)A定义在函数(或过程)B之前,那么函数B就可以调用函数A,并且编译成功,例如下面的 procedure TForm1.btn1Click(Sender: TObject); 和 f ...
- 简简单单的一个PYTHON多进程实现
因为在作自动化部署时,希望能将多个服务分不同的批次进行发布, 同一批次的机器同时发布, 如果前面一批次出错误,后面就需要停止整 个流程. 那可以简单的用threading来实现了. thread_li ...
- android 运行时出现The connection to adb is down, and a severe error has occured.(转)
点击项目run,报了这样的错,前几天都好好的: [2013-09-14 15:27:13 - QualityPicture_Client1.3.1.9.7.1] ----------------- ...
- ASP.NET 4.0 取消表单危险字符验证
/// <summary> /// ASP.NET4.0 表单验证类 /// </summary> public class FormRequestValidation : R ...
- css中box-shadow阴影效果的使用
text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着HTML5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...
- objective-c 遍历文件夹查看文件
#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){ @autoreleasepool ...
- FastDFS实现文件上传下载实战
正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...
- for循环嵌套
今天复习了分支语句以及for循环,新内容主要讲解了for循环的嵌套: 外循环控制行,内循环控制列 下面几个实例: 五行五列的矩阵 左下角是直角的三角形: 左上角是直角的三角形: 右上角为直角的三角形: ...