1.malloc和free
malloc是开辟内存单元的库函数;
malloc不会调用构造函数;
free只是释放malloc所开辟的空间;
free不会调用析构函数。
#include <iostream>
using namespace std;
class A
{
public:
A(int i=0) { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
private:
};
void main()
{
A* p = NULL;//这不是定义了一个对象,是定义了一个指向当前A类类型的指针,p只是一个指针型变量
p = (A*)malloc(sizeof(A));//只开辟空间,只给p开辟了一个A类类型大小的空间,并没有给值
//而定义对象需要调用构造函数去构造对象,构造对象需要开辟空间和给对象赋值
//*p = 10;//加上这句话才能抵得上构造函数的作用
free(p);//只是释放空间
p = NULL;
}
运行结果不会打印A和~A。
2.new和delete
new是运算符;
new会调用构造函数;
new不用强制类型转换,应用比较简单;
delete也是运算符;
delete会调用析构函数,如果构造的是对象,只需要delete一个对象,如果构造的是数组,需要delete全部。
class A
{
public:
A(int i = 0) { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
private:
int m_i;
};
void main()
{
//new是一个运算符,后面跟我们所要new的类型
//new A;//创建了一个A类型的无名对象,会调用构造函数
//A* p = new A;//调用构造函数不是p去调用而是new A去调用
A* p = new A(20);//把20给了i,相当于在new的时候把20直接给到了new出来的空间里面
delete p;
}
运行结果:
如果是new一个对象数组的情况:
class A
{
public:
A(int i = 0) { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
private:
int m_i;
};
void main()
{
A* p = new A[5];//new了一个对象数组,5个对象
delete p;//error 只析构了一次,如下图示
}
运行结果:
class A
{
public:
A(int i = 0) { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
private:
int m_i;
};
void main()
{
//new是一个运算符,后面跟我们所要new的类型
//new A;//创建了一个A类型的无名对象,会调用构造函数
//A* p = new A;//调用构造函数不是p去调用而是new A去调用
//A* p = new A(20);//把20给了i,相当于在new的时候把20直接给到了new出来的空间里面
//delete p;
A* p = new A[5];//new了一个对象数组,5个对象
//delete p;//error
//delete p[];//error
//delete p[5];//error
delete []p;
}
运行结果:
如果构造的是对象,只需要释放一个对象即可;如果构造的是一个数组,则需要全部释放掉。