C++ new delete操作符
//new delete操作符 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 1.new delete 操作符号 都是 c++的关键字 类似于 C语言中的 malloc()函数 free()函数 2.定义对象时,使用了new关键字,会为这个对象在堆上分配内存,不使用new 关键字会直接在栈上分配内存 new 关键字可以分配基础类型内存,数组类型内存,对象类型内存 对于基础类型内存和数组类型内存,new delete关键字的功能和 malloc free关键字的功能基本相同(可以互相替换) 但是对于对象类型内存,new delete关键字会比malloc free多一步操作 new 关键字会调用对象的构造函数 delete会调用对象的析构函数 而malloc 和free不会这么做
所以对象不要使用malloc和free 3.new 运算符动态分配堆内存 使用形式: 指针变量= new 类型(常量) ; 指针变量 = new 类型(表达式) 作用:从堆分配一块 “类型”大小的内存空间,返回该类型空间的首地址(这个跟 C#和 Java不一样) delete 运算符释放已分配的内存空间 使用形式: delete 指针变量; delete [] 指针变量(这个主要用来释放数组的) */ class Point{ public: Point(int _x,int _y,int _z){ cout << "自定义的有参构造函数被调用了1" << endl; x = _x; y = _y; z = _z; } ~Point(){ cout << "自定义的析构函数被调用了3" << endl; } void GetNum(){ printf("pt的值是%d,%d,%d\n",x,y,z); } private: int x; int y; int z; }; //分配基本类型 void ProtectA(){ //new 基础类型---强调 返回的是指针 不是个普通变量 int *p1 = (int *)malloc(sizeof(int)); *p1 = 100; if (p1!=NULL) { free(p1); } //替换成delete 效果一样 /*if (p1!=NULL) { delete p1; }*/ int *p2 = new int; *p2 = 10; printf("p2所指向内存空间的值%d\n",*p2); if (p2!=NULL) { delete p2; } //替换成free 效果一样 /*if (p2 != NULL) { free(p2); }*/ //分配内存的同时初始化 int *p3 = new int(20); printf("p3所指向内存空间的值%d\n", *p3); if (p3!=NULL) { delete p3; } } //分配数组 void ProtectB(){ //new 分配数组 int *parr = (int *)malloc(sizeof(int)*5); // 相当于 int a[5]={0}; memset(parr,0,sizeof(int)*5); parr[0] = 1; *(parr + 1) = 2; if (parr!=NULL) { free(parr); } //可以替换为 delete[] /*if (parr != NULL) { delete[] parr; }*/ int *parr2 = new int[5]; //相当于 int a[5]={0}; memset(parr2, 0, sizeof(int)* 5);//还是可以调用memset()函数初始化 parr2[0] = 5; *(parr2 + 1) = 6; if (parr2 != NULL) { delete[] parr2; } //可以替换为free /*if (parr2!=NULL) { free(parr2); }*/ } void ProtectD(Point **pout/*out*/){ Point *temp = new Point(3, 3, 2); *pout = temp; } //分配对象 void ProtectC(){ //必须用指针变量接受 new操作符的返回值 Point *p = new Point(1,1,2); p->GetNum(); if (p!=NULL) { delete p; //避免野指针 p = NULL; } Point *p2 = NULL; ProtectD(&p2); if (p2 != NULL) { delete p2; p2 = NULL; } } void main(){ ProtectC(); system("pause"); }