【new和delete】
C++在实例化对象的时候,系统会发生两件事情:
1.自动为对象分配内存
2.自动调用构造函数来初始化那块内存。
3.malloc不能为内存初始化,所以我们在C++中使用new和delete
1、和 malloc calloc realloc 比较
1、malloc必须返回一个指针,返回值还是void类型,c++不允许将void赋值给其他任何指针,必须强转。
2、malloc 可能申请失败,必须判断返回值来确定是否申请成功。
3、malloc 不会调用构造函数,free不会调用析构函数。
2、给基本类型申请、释放空间
int *p ;
p = new int (100) // *p = 100;
delete p;
3、给基本数组类型申请、释放空间
int * arr = new int[100]{1,2,.......,100};//100个整型元素
char *arr = new char[100] ; // 100个字符类型元素
delete []arr ; //new 的时候有[],释放的时候就要有[];
char *arr = new char[32]{"hehe"} // err ;
只能一个一个写进去 或者不初始化然后使用strcpy拷进去
char *arr = new char[32]{'h','e','h','e'};
char *arr = new char ;
strcpy(arr,"hello,wrold");
for(int i =0;i<strlen(arr);i++)
{
cout<<*(arr+i);
}
4)给类对象申请空间
#include<iostream>
using namespace std;
class person{
private: char m_name[32];
int m_age;
public: person(char *name ,int age)
{
strcpy(m_name,name);
m_age = age;
cout<<"构造函数"<<endl;
}
~person()
{
cout<<"析构函数"<<endl;
}
void showperson()
{
cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl;
}
};
void test01(void )
{
person *ob1 = new person("bob",18);
ob1->showperson();
delete ob1;
}
运行结果:
分析:使用new的时候会自动调用构造函数,使用delete的时候会自动调用析构函数。
5)对象数组
void test03()
{
person *arr = new person[2]{person("lucy",12),person("bob",13)};
//指针访问
arr->showperson();
(arr+1)->showperson();
//数组下标访问
arr[0].showperson();
arr[1].showperson();
//数组下标等同于指针偏移量
(*(arr)).showperson();
(*(arr+1)).showperson();
delete [] arr;
}
运行结果: