文档章节

C++ 定位New

吃一堑消化不良
 吃一堑消化不良
发布于 2016/10/14 10:51
字数 408
阅读 49
收藏 0

一、定位new表达式的常见形式

new(address) type;
new(address) type(initializers);
new(address) type[size];
new(address) type[size]{braced initializer list};
//定位new表达式调用 void *operator new(size_t, void *); 分配内存。
//address必须是个指针,指向已经分配好的内存。为了使用这种形式的new表达式,必须包含头文件<new>。
//定位new表达式不能调用delete删除定位new生成的对象,需要人为调用对象的析构函数,并人为释放掉占用的内存。

二、定位new表达式的作用

        创建对象但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。

三、实例:

#include <iostream> 
#include <new> 
using namespace std; 

const int chunk = 16; 

class Foo 
{ 
public: 
    int val(){return _val;} 
    Foo(){_val=0;} 
private: 
    int _val; 
}; 

int main() 
{ 
// 预分配内存buf 
char *buf = new char[sizeof(Foo) * chunk]; 

// 在buf中创建一个Foo对象
Foo *pb=new (buf) Foo; 

// 检查一个对象是否被放在buf中
if(pb->val()==0) cout<<"new expression worked!"<<endl; 
// 这里不存在与定位new表达式匹配的delete表达式,即:delete pb
// 其实只是为了释放内存的话,我们不需要这样的表达式,因为定位new表达式并不分配内存。
// 如果在析构函数中要做一些其他的操作呢?就要显示的调用析构函数。
// 当程序不再需要buf时,buf指向的内存被删除,它所包含的任何对象的生命期也就都结束了。

    delete[] buf; 
    return 0; 
}

 

© 著作权归作者所有

吃一堑消化不良
粉丝 28
博文 188
码字总数 113563
作品 0
浦东
程序员
私信 提问
浅谈MFC内存泄露检测及内存越界访问保护机制

本文所有代码均在VC2008下编译、调试。如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似的。对于本文的标题,实在不知道用什么表示更恰当,因为本文不...

songchang
2012/09/28
217
0
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
iOS学习之Map,定位,标记位置的使用

iOS上使用地图比Android要方便,只需要新建一个MKMapView,addSubView即可。这次要实现的效果如下: 有标注(大头针),定位,地图。 1、添加地图 1.1 新一个Single View app ,选择默认项,创...

嘻哈开发者
2014/07/24
166
0
Map,定位,标记位置的使用

IOS上使用地图比Android要方便,只需要新建一个MKMapView,addSubView即可。这次要实现的效果如下: 有标注(大头针),定位,地图。 1、添加地图 1.1 新一个Single View app ,选择默认项,创...

jackyyang
2012/07/15
2K
2
SonarQube C/C++/Objective C 3.11 发布

SonarQube C/C++/Objective C 3.11 发布,这是 Sonar 平台用来检查 C/C++/Objective-C 代码的插件。 更新日志: Bug [CPP-552] - NOSONAR tag should work for preprocessing directives (......

oschina
2016/04/14
812
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部