c++内存管理方式:
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提 出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
内置类型:
int main()
{
int* ptr1 = new int;
int* ptr2 = new int(10);
delete ptr1;
delete ptr2;
return 0;
}
ptr1是申请1个int的空间,ptr2是申请一个int空间并将其初始化为10,delete是对空间进行释放
int* ptr1 = new int[10];
int* ptr2 = new int[10] {1, 2, 3, 4, 5};
delete []ptr1;
delete []ptr2;
创建一个数组空间,ptr2是对内容进行初始化,删除时delete要加[]
自定义类型
对于自定义类型,malloc等函数不能进行初始化,但我们可以用new进行初始化
class A
{
public:
A(int n=4)
:_a(n)
{
cout <<"A()" << endl;
}
A(const A& aa)
:_a(aa._a)
{
cout << "A(const A&aa)" << endl;
}
A& operator=(const A& aa)
{
_a = aa._a;
cout << "A& operator"<< endl;
return *this;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A* p1 = new A;//调用构造
delete p1;//会自动调用析构
return 0;
}
new在对自定义类型进行处理时会自动调用构造函数,而delete会自动调用析构函数
int main()
{A* p2 = new A[10]{ 1,2,3,4,5 };
delete[] p2;
return 0;
}
特别注意,有析构函数时必须要加delete后的[],否则会崩溃,这是因为有析构函数时系统会多开4个字节空间存储元素个数,即一个int整形大小 ,所以在这里建议配对进行使用
定位new表达式
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
使用场景:
定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义 类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化
int main()
{
A* p1 = (A*)operator new(sizeof(A));
new (p1)A(10);
p1->~A();
operator delete(p1);
return 0;
}
int main()
{
A* p2 = (A*)operator new[](sizeof(A) * 10);
for (int i = 0; i < 10; i++)
{
new(p2 + i)A(i);
}
for (int i = 0; i < 10; i++)
{
(p2 + i)->~A();
}
operator delete [](p2);
return 0;
}