预分配和多维内存

堆和栈

堆区内容需要手动释放,栈区不能手动释放。释放的化,会报错。

malloc和new的区别

1.new会自动分配空间,malloc需要手动分配空间且返回类型是void*需要自己区修改

2.new,delete会调用析构构造函数,mallocfree不会

3.new是从自由存储区获得内存,malloc从堆中获取内存;

构造函数不能用virtual来写,析构可以加virtual,然后在析构的时候就会走子类析构。

如果是指针指向一个一维数组,delete []p,得加个括号

如果是个二维数组,得这么创建和删除

	int **hello = new int *[1024]; //这是个二维数组的创建
	for (int i = 0; i < 1024; i++) {
		hello[i] = new int[10];
	 }
	for (int i = 0; i < 1024; i++) {
		delete hello[i] ;
	}
	delete[]hello;

三维数组的创建和删除也是以此类推

	int*** SSS = new int** [1024];
	for (int i = 0;i< 1024;i++)
	{
		SSS[i] = new int* [10];
		for (int j = 0;j < 10;j++)
		{
			SSS[i][j] = new int[10];
		}
	}

	for (int i = 0; i < 1024; i++)
	{
		SSS[i] = new int* [10];
		for (int j = 0; j < 10; j++)
		{
			delete[] SSS[i][j];
		}
		delete[] SSS[i];
	}
	delete[] SSS;

}

不能太过于频繁调用new和delete,频繁调用会出现内存碎片

 

 

 那解决这个最好的方法就是办法就是写一个预分配内存的类

template<class T>
class FPreDistribution
{
public:
	FPreDistribution(int InCount)
		:Numer(InCount)
	{
		Data = new T[InCount];
	}

	~FPreDistribution()
	{
		delete[] Data;
	}

	T* operator[](int Index)//用来访问对象的
	{
		return &Data[Index];
	}

	inline int Num() { return Numer; }
private:
	T* Data;
	int Numer;//number用来记录数据长度
};
//这样来调用
FObject* p_mv = new FObject[3];

	FPreDistribution<FObject> PreDistribution(3);
	FObject *Hellop = PreDistribution[2];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值