码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-12-30 13:48:49      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:new操作符   操作符new 定位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();

}


技术分享


技术分享


本文出自 “10747227” 博客,转载请与作者联系!

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

标签:new操作符   操作符new 定位new

原文地址:http://10757227.blog.51cto.com/10747227/1729883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!