C++学习笔记(十二):析构函数

  • 析构函数和构造函数类似,构造函数是对变量进行初始化,析构函数是删除变量,释放变量分配的内存空间。
  • c++内存空间的管理和Java不同,Java是jvm虚拟机进行管理内存,而c++是通过程序员自己去管理分配的内存。
  • 当通过new方式分配一个对象,调用delete时,会调用类的析构函数。
  • #include 
    
    class Entity {
    public:
    	Entity()
    		: x(5.0f), y(3.1f)
    	{
    		std::cout << "调用构造函数" << std::endl;
    	}
    	Entity(float x, float y)
    	{
    		this->x = x;
    		this->y = y;
    	}
    	~Entity() 
    	{
    		std::cout << "调用析构函数" << std::endl;
    	}
    public:
    	float x, y;
    	void Print()
    	{
    		std::cout << x <<  "  " << y << std::endl;
    	}
    };
    
    int main()
    {
    	Entity *e1 = new Entity;
    	e1->Print();
    
    	delete e1;
    	std::cin.get();
    }

    C++学习笔记(十二):析构函数_第1张图片

  • 如果在类中通过new对成员变量分配了内存空间,则可以在析构函数对分配的内存空间进行释放。

  • #include 
    
    class Entity {
    public:
    	Entity()
    		: x(5.0f), y(3.1f)
    	{
    		std::cout << "调用构造函数" << std::endl;
    	}
    	Entity(float x, float y)
    	{
    		this->x = x;
    		this->y = y;
    	}
    	~Entity() 
    	{
    		delete[] Array;
    		std::cout << "调用析构函数,释放为Array分配的内存" << std::endl;
    	}
    public:
    	int *Array= new int[5];
    	float x, y;
    	void Print()
    	{
    		std::cout << x <<  "  " << y << std::endl;
    	}
    };
    
    int main()
    {
    	Entity *e1 = new Entity;
    	e1->Array[0] = 10;
    	std::cout << e1->Array[0] << "***" << std::endl;
    	e1->Print();
    	delete e1;
    
    	std::cin.get();
    }

    C++学习笔记(十二):析构函数_第2张图片

  • 析构函数一般不用自己手动调用。如果两次调用析构函数,每次都对同一个内存空间进行释放,程序运行就会出错,如下所示:

  • #include 
    
    class Entity {
    public:
    	Entity()
    		: x(5.0f), y(3.1f)
    	{
    		std::cout << "调用构造函数" << std::endl;
    	}
    	Entity(float x, float y)
    	{
    		this->x = x;
    		this->y = y;
    	}
    	~Entity() 
    	{
    		delete[] Array;
    		std::cout << "调用析构函数,释放为Array分配的内存" << std::endl;
    	}
    public:
    	int *Array= new int[5];
    	float x, y;
    	void Print()
    	{
    		std::cout << x <<  "  " << y << std::endl;
    	}
    };
    
    int main()
    {
    	Entity *e1 = new Entity;
    	e1->Array[0] = 10;
    	std::cout << e1->Array[0] << "***" << std::endl;
    	e1->Print();
    	e1->~Entity();
    	delete e1;
    
    	//std::cin.get();
    }

    C++学习笔记(十二):析构函数_第3张图片

  • 如上图所示,内存泄漏或者释放无效指针就会产生上图中的错误。

你可能感兴趣的:(c++,学习,笔记)