C++复习记录2 二义性 malloc free 以及 new delete

首先通过一段例子程序来看函数的二义性,有重载函数的构造函数造成的。红色。另外还有一些关于new和delete以及析构函数应该注意的地方


#include<iostream>

using namespace std;
class Point
{
      public:
         Point()
         {
            X=Y=0;
            cout<<"mo ren gou zao"<<endl;
                }
         // Point(int xx=0,int yy=0) //错误,因为这个对构造函数的重载,
         //可以在缺省参数的情况下也可以调用,当声明一个类的对象的时候,
         //编译器就不知道该用默认的Point(),还是这个函数,编译器就会报错
         //
存在函数二义性 
         Point(int xx,int yy)
         {
                   X=xx;
                   Y=yy;
                   countP++;
                   cout<<"ding yi gou  zao"<<endl;
                   
                   }
         Point(Point &p);
         ~Point()
         {cout<<"xigou"<<endl;} //显示定义析构函数,用来析构用new等动态分配的对象
                                                  //自身的默认析构函数,不可以析构动态分配的对象 

         int GetX(){return X;}
         int GetY(){return Y;}
         void Move(int x,int y)
         {X=x;Y=y;}
         static void GetC()
         {
            cout<<"Object id="<<countP<<endl;
         }
      private:
          int X,Y;
          static int countP;
};
Point::Point(Point &p)
{
    X=p.X;
    Y=p.Y;
    countP++;
    cout<<"copy"<<endl;
}
int Point::countP=0;
int main()
{
    
    Point *p=new Point;
    delete p;        //可以显示的用delete进行析构,不这样,在对象生命周期结束时
                          //也会自动调用我们显示定义的析构函数,进行对动态对象的析构 

    p=new Point(1,2);
    delete p;
    
    Point *p1=new Point[2]; //动态创建对象数组,不能进行初始化,调用无参的构造函数 
    p1[0].Move(5,10); //利用指针访问数组元素并初始化 
    delete[ ] p1; //删除,记得new[]和delete[]配对使用 ,删除整个数组 
    void (*gc)()=Point::GetC;
    //int *count=&Point::countP;
    Point A(4,5); 
    cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
    // cout<<"Object id="<<*count<<endl;
    gc();
    Point B(A);
    cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
    //cout<<"Object id="<<*count<<endl;
    gc();
    //delete A;//错误因为,delete和new只能配对使用。 
    //delete B;

    system("pause");
    return 0;
    system("pause");

    }


malloc和free 在c++中还保留一大部分原因是因为对c的兼容,另外malloc和new都是通过显示定义分配的内存,都需要显示的人为进行释放,系统不会进行自动释放。

malloc和free需要库文件的支持,是库函数不是操作符,不在编译器的控制权限之内。而new可以实现,在创建对象的时候自动执行构造函数,在对象消亡时自动执行析构函数。所以new是进行动态内存分配和初始化的操作符,而delete是进行内存清理和释放的操作符。


malloc  free 的用法

void *malloc(size_t,size);

int *p=(int*)malloc(sizeof(int)*length);

1通过malloc返回的是一个void类型的指针,void类型的指针再每次使用的时候必须根据要使用的类型对其进行强制类型转换,负责编译器会报错。

2不关心要申请的内存的字节类型,只关心总的字节数。

free

void free(void * memblock);

1它不像malloc那么复杂是因为它已经知道当前要释放的内存字节的类型以及内存总的大小了。


new  delete的用法

int *p=new int[length];//new一个数组

new 比malloc用法简单很多,是因为new内置了类型转换,安全检查,sizeof等功能,对于非内部数据类型会完成初始化工作。

new和delete一般成对出现,用来对单个内存空间进行处理

比如:int *p=new int;  new操作符会根据请求内存的数据类型这里是int来分配内存空间的大小。

           delete p;

new创建动态数组时,

比如:int *p=new int[10];

            delete[ ]   p;//注意使用new[ ]创建的数组则需要用delete[ ],如果用了delete则只是删除了int[0]

因为new在进行创建动态数组的时候,会自动在内存中保存一个整数,这个整数是用来记录,数组中元素的个数。这是因为比如你创建的对象数组,则在delete时需要知道有多少个对象,然后去调用多少次析构函数来释放内存。


new delete  和malloc   free的区别

1、malloc分配的内存大小需要手动计算字节数,而new则会自动根据要申请内存的数据类型进行自动计算

2、new内置安全类型检查,而malloc没有安全类型检查。

比如:int  *p=malloc(2*sizeof(float));编译器不报错

           int *p=new float[2]; 编译器报错

3、malloc返回的是空void类型的指针,使用时必须根据申请内存的数据类型进行强制数据类型转换,而new不需要,因其内置了强制类型转换。

比如:  int *p=(int *)malloc(sizeof(int)*length);

              int *p=new int[length];

4、new 是操作符,可以进行重载,自定义分配策略等,而malloc不可以。

5、malloc和free需要库文件的支持,new和delete不需要。

6、new在创建对象的时候自动调用构造函数,delete自动调用析构函数,而malloc和new不可以。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值