//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
",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
",*p2);
if (p2!=NULL)
{
delete p2;
}
//替换成free 效果一样
/*if (p2 != NULL)
{
free(p2);
}*/
//分配内存的同时初始化
int *p3 = new int(20);
printf("p3所指向内存空间的值%d
", *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");
}