c++动态内存开辟之 new 的三种形态


1.new 操作符  与   操作符 new

//new                new操作符

//delete             delete操作符

//operator new       操作符new

//operator delete    操作符delete

void main()

{

Date *p_date = (Date *)operator new (sizeof (Date));  //只是开辟空间

new (p_date)Date (1, 1, 1);      //定位  new

p_date->~Date();               //析构函数的显示调用

operator delete (p_date);      //空间的释放

//等价于

Date *p_date = new Date(1,1,1);

delete p_date;

//注意:这里会造成内存泄露

void* p_date = new Date (1, 1, 1);

operator delete (p_date);       (相当于free)

//new 开辟了空间并调用了构造函数,但在析构时,系统只析构了p_date所指向的空间,并没有调用析构函数

//因为p_date是void类型的指针,系统不知道它是一个对象,所以没调用析构函数

}

2.定位new   //placement new

new(原始指针)类型(初始化参数列表);

注释:在原始空间的指针p 所指的位置 构造出一个类的对象

例:new(p)Date(10);

void * operator new(size_t sz, Date* d , int pos)        //定位new函数(重载)

{

return &d [pos];

}

void * operator new(size_t sz,int*d,int pos)

{

return &d [pos];

}

void main()

{

Date *p = new Date;

new (p)Date (1995, 1, 31);

Date *p = new Date[10];

new (p,2)Date (1995, 1, 31);        //定位new的应用,给第二个元素初始化

int a[10];

new (a, 5)int (10);

}

3.三种 new 实例:

#include<iostream>

#include<string>

using namespace std;

void * operator new(size_t n)       //操作符 new

{

return malloc(n );

}

void operator delete(void *p)     //操作符 delete

{

free( p );

}

void * operator new[](size_t n)    //操作符 new[]

{

return malloc(n );

}

void operator delete[](void *p)    //操作符delete[]

{

free( p );

}

class Date

{

public :

Date( int x = 0):_date(x)

{

}

~Date()

{}

protected :

int _date;

};

//模拟实现  new ,delete

void Test()

{

Date *p = (Date *) operator new (sizeof (Date)*5);   //开辟空间

for (int i = 0; i < 5; i++)

{

new (p + i)Date (i*10);        //placement new (定位new) 指哪打哪!!!

}

for (int i = 0; i < 5; i++)

{

(p + i)->~Date();           //显示掉用析构函数

}

operator delete (p);        //释放空间

}

void main()

{

Test();

}

时间: 2024-10-10 02:20:13

c++动态内存开辟之 new 的三种形态的相关文章

new的三种形态

C++语言一直被认为是复杂编程语言中的杰出代表之一,不仅仅是因为其繁缛的语法规则,还因为其晦涩的术语.下面要讲的就是你的老熟人-new: 它是一个内存管理的操作符,能够从堆中划分一块区域,自动调用构造函数,动态地创建某种特定类型的数据,最后返回该区域的指针.该数据使用完后,应调用delete运算符,释放动态申请的这块内存. 如果这就是你对new的所有认识,那么我不得不说,你依旧被new的和善外表所蒙蔽着.看似简单的new其实有着三种不同的外衣. 是的,你没有看错,也不用感到惊奇,一个简单的new

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化     本文地址:http://techieliang.com/2017/12/729/ 文章目录 1. 介绍 2. 源码  2.1. using_checkbox_item.h  2.2. using_checkbox_item.cpp 3. 说明 1. 介绍 复选框有三种形态:全选对勾.全不选

动态内存开辟函数

realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小). 头文件:#include <stdlib.h> 有些编译器需要#include <alloc.h>,在TC2.0中可以使用alloc.h头文件 功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来me

c++中的动态内存管理

c++中的动态内存管理问题 c++中使用new和delete实现动态内存管理.new和delete实现动态管理对象,new[]和delete[]实现动态管理对象数组.c++中的new和delete运算符均使用我们c中学过的malloc和delete函数实现动态内存的开辟. 首先,先简单介绍下c中的几个动态内存函数malloc,realloc,calloc,free; void *malloc(size_t size); //动态内存开辟函数 void free(void *pointer);  

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS

Win2012R2 Hyper-V初级教程06 &mdash; 动态内存调整

动态内存是一种新 Hyper-V 功能,可帮助您更有效地使用物理内存.使用动态内存,Hyper-V 将内存视为一种可在运行的虚拟机之间自动重新分配的共享资源.动态内存基于内存需求的变化和您指定的值,调整可供虚拟机使用的内存量. 动态内存可帮助您更有效地使用内存资源.在引入此功能之前,要更改可供虚拟机使用的内存量,只能在关闭虚拟机时完成.使用动态内存,Hyper-V 可依据在虚拟机内运行的工作负载或应用程序所需的内存量的变化,动态地为虚拟机提供更多或更少的内存.因此,Hyper-V 能够在配置了动

第1例——static关键字的三种作用

术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量.随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数.为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义.最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 第一种作用: 程序开始时为静态变量分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. // demo0

Stack的三种含义【转】

学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out). 在这种数据结构中,数据像积木那样一层层堆起来,后面加入的数据就放在最上层.使用的时候,最上层的数据第一个被用掉,这就叫做"后进先出". 与这种结构配套的,是