C++动态内存和类



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删除对象时,析构函数才会被调用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章