- 析构函数和构造函数类似,构造函数是对变量进行初始化,析构函数是删除变量,释放变量分配的内存空间。
- 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(); }
-
如上图所示,内存泄漏或者释放无效指针就会产生上图中的错误。