C++中new可以动态分配内存,这和C语言中malloc的作用类似。但不同的是new创建类的时侯会自动调用构造函数,而malloc则不会。
因此C++中一般使用new来进行动态分配内存,与malloc一样用new分配的内存可以需要释放,但并不是使用free来释放,而是使用delete来释放。同样delete会自动调用析构函数,而free则不会。
C++中new可以动态分配内存,这和C语言中malloc的作用类似。但不同的是new创建类的时侯会自动调用构造函数,而malloc则不会。
因此C++中一般使用new来进行动态分配内存,与malloc一样用new分配的内存可以需要释放,但并不是使用free来释放,而是使用delete来释放。同样delete会自动调用析构函数,而free则不会
new的具体使用方式如下:
类型 *变量名 = new 类型;
delete 变量 / delete[] 变量;
类型包括数组、结构体和类等等
数组申请动态内存后,要使用delete[]才能把内存清除干净,另外使用delete后指针并不会杯清空,因此应该复制为NULL,来防止野指针的出现。
point *ptr1=new point; //定义的一个指针,并且让指针指向一个内存空间
delete prt1 //回收了指针所指向的内存空间,指针仍然存在
ptr1= new point(1,2) //再次让指针指向一个新申请内存空间
C++自动提供了五种成员函数:默认构造函数(如果没有定义构造函数),复制构造函数(如果没有定义),赋值操作符(如果没有定义),默认析构函数(如果没有定义),地址操作符(如果没有定义)。
默认构造函数:如果程序没有提供任何构造函数,那么编译器将提供一个不带任何操作、不接收任何参数的构造函数,因为创建对象时总会用到构造函数。如果定义了构造函数,C++将不会用到定义默认构造函数。
复制构造函数:复制构造函数用于将一个对象复制到新创建的对象中,也就是用于初始化而不是常规赋值过程中,它的原型通常如下:class_name(const class_name &)。那么什么时候调用复制构造函数呢?新建一个对象并将其初始化为同类现有对象时,都会调用复制构造函数。将函数按值传递或者函数返回对象时,也会调用复制构造函数。默认的复制构造函数会逐个复制非静态成员变量,复制的是成员的值
如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。复制的另外一种形式是只复制指针值。
赋值操作符:C++允许通过自动类重载赋值操作符实现对象赋值,这种操作符的原型如下:Class_name & Class_name::operator = (const Class_name &),它接受并返回一个指向类对象的引用。
在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete,如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带,有一个例外,就是在构造函数中使用new初始化指针函数,而在另外一个构造函数中将指针初始化为空,delete可以用于空指针。
赋值操作符的重载,此操作符只能在类的方法中重载,以实现深度拷贝
StringBad & StringBad::operator = (const StringBad & st)
{
if(this==&st)
return *this;
len=st.len;
delete[] str; //将此前创建的空间释放
str=new char[len+1];//申请新的符合大小的空间
std::strcpy(str,st.str);
return * this;//对原对象有更改因此不能是const返回类型
}
下面几种情况析构函数被调用:
当对象是动态变量时,执行完定义该对象的程序块时,将调用该对象的析构函数。
当对象是静态变量时,程序结束时将调用对象的析构函数。
当对象是用new创建的时,仅当显示使用delete删除对象时,析构函数才会被调用。