(20200417)C++ 语言new/delete与C语言 malloc/free总结

 

new/delete补充【20200429】:

补充1:new创建一维数组和二维数组

————————————————————————————

参考:

1】指针数组,数组指针,二级指针【https://blog.csdn.net/sinat_32602421/article/details/105296689

2】https://www.cnblogs.com/kid971220/p/10497752.html

————————————————————————

#include <iostream>
//#include <malloc.h>
using namespace std;

int main()
{
	//---C++: new/delete
	//new 申请单个类型空间
	int  *p1 = new int;    //申请int(4字节)空间
	*p1 = 12;
	char *p2 = new char;   //申请char(1字节)空间
	*p2 = 'k';
	int  *p3 = new int(24);//申请空间时直接初始化为24=>int p3=24;
	char *p4 = new char('c');//char p4='c';


	//new 申请一维数组(连续)空间
	int *p5 = new int[5];         //在堆区申请5个int元素的数组空间=20字节=>int p5[5];
	p5[0] = 30; p5[1] = 31; p5[2] = 32; p5[3] = 33; p5[4] = 34;//上面p5[5]未初始化
	int *p6 = new int[5];         // => int p6[5] = {0,0,0,0,0};
	memset(p6, 0, sizeof(int)* 5);//memset(p6=申请空间地址,0表示初始化为0,4*5表示初始化的空间大小20个字节)


	//new 申请二维数组(连续)空间
	int(*p8)[10] = new int[2][10];  //int p8[2][10],p8是数组指针
	int(*p9)[10] = new int[][10];  //int p9[][10],  p9是数组指针

	int**p10; p10 = new int*[10];  //二级指针p10,指向int*[10](表示一个有10个元素的指针数组)
	for (int i = 0; i != 10; ++i)
	{
		p10[i] = new int[5];
	}

	//释放空间
	delete p1;
	delete p2;
	delete p3;
	delete p4;

	delete[] p5;
	delete[] p6;
	delete[] p8;
	delete[] p9;
	delete[] p10;


	system("pause");
	return 0;
}

说明:

1】

2】申请一维数组空间:

说明:p5是int *类型的指针,指向一个5个元素的数组:类似于一下内容:

int a[5];

int *p5;

p5=a;

3】申请二维数组空间:

方法1:使用数组指针

方法2:使用二级指针

说明:

 1】int *p1 = new int[10];  //返回的是一个指向int的指针int*  

2】int (*p8)[10] = new int[2][10]; 
new了一个二维数组, 去掉最左边那一维[2], 剩下int[10], 所以返回的是一个指向int[10]这种一维数组的指针int (*)[10].  

3】

C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数。采用这种格式,列数必须指出,而行数无需指定。在这里,p的类型是TYPE*[N],即是指向一个有N列元素数组的指针。

4】 还有一种方法,可以不指定数组的列数:
     int**p10;   
    p10 = new int*[2];  //二级指针p10,指向int*[2](表示一个有2个元素的指针数组)
    for (int i = 0; i != 2; ++i)
    {
        p10[i] = new int[10];

5】
int (*p3)[2][10] = new int[5][2][10];  new了一个三维数组, 去掉最左边那一维[5], 还有int[2][10], 所以返回的是一个指向二维数组int[2][10]这种类型的指针int (*)[2][10].

 

20200429

 

new/delete补充【20200429】:

——————————

补充2:new创建结构体和类对象(结构体可看做对象)

1】创建结构体:

2】创建对象:

使用New创建对象和直接创建对象的区别:

1】new创建对象需要指针接收,一处初始化,多处使用
2】new创建对象使用完,需delete释放空间
3】new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间
4】new对象指针用途广泛,比如作为函数返回值、函数参数等
5】频繁调用场合并不适合new,就像new申请和释放内存一样

如:

方法1创建对象,使用完后不需要手动释放,该类析构函数会自动执行;

方法2创建对象:new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

代码:

#include <iostream>
//#include <malloc.h>
using namespace std;

class cclass
{
public:
	int a;
	void show()
	{
		cout << a << endl;
	}
};

struct stru
{
	int a;
};

int main()
{


	//---定义结构体(结构体可以看做对象)
	stru mystru;         //创建结构体方法1
	stru *p1 = new stru; //创建结构体方法2(使用new)
	delete p1;

	//---创建对象
	cclass ca;                //创建对象方法1(不使用new)
	cclass *p2 = new cclass;  //创建对象方法2(使用new)
	delete p2;

	p1->a = 23;
	cout << p1->a << endl;

	p2->a = 24;
	p2->show();

	system("pause");
	return 0;
}

 

  
 

C++空间申请与释放(new  delete)和C的空间申请与释放(malloc  free):<20200429>

#include <iostream>
//#include <malloc.h>
using namespace std;

class cclass
{
public:
	int a;
	void show()
	{
		cout << a << endl;
	}
};

struct stru
{
	int a;
};

int main()
{
	//---定义结构体
	stru mystru;

	//---创建对象
	cclass ca;

	//---C: malloc/free
	int *p = (int *)malloc(sizeof(int));    //申请4个字节(int)空间=>int p;
	int *p0 = (int *)malloc(sizeof(int)* 5);//申请20个字节的连续空间=>int p0[5];
	//释放空间
	free(p);
	free(p0);

	//---C++: new/delete
	//new 申请单个类型空间
	int  *p1 = new int;    //申请int(4字节)空间
	char *p2 = new char;   //申请char(1字节)空间
	int  *p3 = new int(24);//申请空间时直接初始化为24=>int p3=24;
	stru *p4 = new stru;   //申请一个结构体空间
	cclass *p44 = new cclass;  //申请一个对象空间,调用构造函数

	//new 申请数组(连续)空间
	int *p5 = new int[5];         //在堆区申请5个int元素的数组空间=20字节=>int p5[5];
	int *p6 = new int[5];         // => int p6[5] = {0,0,0,0,0};
	memset(p6, 0, sizeof(int)* 5);//memset(p6=申请空间地址,0表示初始化为0,4*5表示初始化的空间大小20个字节)
	
	//对申请空间进行 读和写 操作
	*p1 = 12;//写数据
	*p2 = 'k';
	p4->a = 23;
	p44->a = 24;
	p5[0] = 30; p5[1] = 31; p5[2] = 32; p5[3] = 33; p5[4] = 34;
	
	//读数据
	cout << *p1 << endl;
	cout << *p2 << endl;//
	cout << *p3 << endl;
	cout << p4->a << endl;
	p44->show();
	cout << p5[0] << " " << p5[1] << endl;//p[5]要初始化 不然输出随机的数
	cout << p6[0] << " " << p6[1] << endl;

	//C++释放空间: delete+指针
	delete p1;
	delete p2;
	delete p3;
	delete p4;
	delete p44;
	delete[] p5;//p5是数组连续空间
	delete[] p6;//p6是数组连续空间


	system("pause");
	return 0;
}

 

1】

2】

3】

4】

 

5】

 

6】

7】C的malloc和free在C++可以使用;但是在对象空间的申请不适用,因为new和delete可以触发构造函数和析构函数,但malloc和free不可以;

  
  

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值