现在的位置: 首页 > 综合 > 正文

定位的new和new[ ]运算符

2013年03月20日 ⁄ 综合 ⁄ 共 1344字 ⁄ 字号 评论关闭

同一作用域下的同名函数,只要参数列表不同,即可重载。重载newnew[
]
运算符时,函数的第1个参数是固定的,表示申请分配内存的长度。用户在不改变第1个参数的情况下,可以随意增加参数,重载多个newnew[
]
运算符函数。一个比较实际的例子就是重载定位的newnew[ ]运算符,即为newnew[ ]重载函数增加1个指针类型的参数,newnew[
]
表达式调用时,返回该指针指定位置的内存地址。

1   //程序示例

 2 
#include"malloc.h"

 3 
#include<iostream>

 4 
using std::cout;

 5 
using std::endl;

 6 

 7 
class Point

 8 
{

 9 
public:

10 
       double x,y;

11 
       Point(double x1,double y1):x(x1),y(y1)

12 
       {

13 
              printf("1
Point对象被创建/n");

14 
       }

15 
       ~Point()

16 
       {

17 
              x=y=0;

18 
              printf("1
Point对象被释放/n");

19 
       }

20 
       void* operator new(size_t, double* p)

21 
       {

22 
              return p;

23 
       }

24 
       void operator delete (void* ,double*)

25 
       {}

26 
};

27 

28 
void print(double * d,int n)

29 
{

30 
       for(int i=0;i<n;++i)

31 
              cout<<d[i]<<" ";

32 
       cout<<endl;

33 
}

34 
int main()

35 
{    

36 
       double d[6]={1.1,1.2,1.3,1.4,1.5,1.6};

37 
       print(d,6);

38 

39 
       Point* p=new(d+2) Point(100,100);

40 
       print(d,6);

41 

42 
       p->Point::~Point();

43 
       print(d,6);     

44 
      

45   
    return 0;

46 
}

显示结果:

1.1 
1.2  1.3  1.4 
1.5  1.6

1Point对象被创建

1.1 
1.2  100  100 
1.5  1.6

1Point对象被释放

1.1 
1.2  0  0 
1.5  1.6

 

 

 

当定位new运算符是在已经分配好的内存上进行二次分配时,为了避免同一块内存被释放多次,所以,最好不要使用delete表达式释放定位的new运算符所分配的内存。对于本例来说,数组d的内存来自于栈,main函数结束时将自动释放,如果在程序中使用类似delete
p
这样的表达式,必然引起程序出现错误。那么,为了在不使用delete表达式的情况下,也能够调用Point对象析构函数,我们可以向第42行代码那样进行析构函数的显示调用。

抱歉!评论已关闭.