堆和栈
堆区内容需要手动释放,栈区不能手动释放。释放的化,会报错。
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];