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

文章讲述了C++中构造函数和析构函数的作用,以及它们在内存管理中的区别。重点介绍了如何在类中使用new和delete操作符分配和释放内存,以及析构函数自动调用的情况和不当使用可能导致的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 析构函数和构造函数类似,构造函数是对变量进行初始化,析构函数是删除变量,释放变量分配的内存空间。
  • c++内存空间的管理和Java不同,Java是jvm虚拟机进行管理内存,而c++是通过程序员自己去管理分配的内存。
  • 当通过new方式分配一个对象,调用delete时,会调用类的析构函数。
  • #include <iostream>
    
    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();
    }

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

  • #include <iostream>
    
    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();
    }

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

  • #include <iostream>
    
    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();
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值