关于调用构造函数和析构函数的时机,求教!该怎么处理
关于调用构造函数和析构函数的时机,求教!
程序没有错误,我主要不解的是关于构造函数和析构函数的调用时机问题不太清楚:
(我在构造函数和析构函数中都附加了一个输出)
我采用以下形式建立类:
这上面的程序按着我所理解的形式调用了构造函数和析构函数
可是如下代码:
为什么需要使用delete释放相关后才能够调用析构函数?
何解?能否讲具体一点,谢谢
------解决方案--------------------
用new分配的对象在堆上,必须用delete来释放
------解决方案--------------------
------解决方案--------------------
应该这样说,你在程序里面显式地分配了内存,你就要显式地释放掉,因为程序不知道你什么时候要释放掉。
而在第一例中,每个对象都有确定的作用域,编译器可以帮你完成这件事情。
------解决方案--------------------
当使用Employee test1("Ivan","Long");这种方式创建一个对象时,此对象是一个栈上的对象,栈上的内存是在此函数模块结束时由系统自动释放,那个时刻,对象的析构函数也就自动被调用了。
然而通过Employee *test1=new Employee("Ivan","Long");这种方式创建的对象,它是一个堆上的对象,堆内存的申请和释放都是有程序员自己管理的。所以,当你delete一个对象时,它的析构函数才会被调用。
程序没有错误,我主要不解的是关于构造函数和析构函数的调用时机问题不太清楚:
(我在构造函数和析构函数中都附加了一个输出)
我采用以下形式建立类:
- C/C++ code
#include<iostream.h> #include"EMPLOYEE.H" Employee test0("Esion0","You0"); void main() { cout<<"实例化前的对像个数是:"<<Employee::getCount()<<endl; Employee test1("Ivan","Long"); Employee test2("Esion","You"); cout<<"实例化后的对像个数是:"<<Employee::getCount()<<endl; { Employee test3("Esion2","You2"); } cout<<"实例化后的对像个数是:"<<Employee::getCount()<<endl; }
这上面的程序按着我所理解的形式调用了构造函数和析构函数
可是如下代码:
- C/C++ code
#include<iostream.h> #include"EMPLOYEE.H" Employee *test0=new Employee("Esion0","You0"); void main() { cout<<"实例化前的对像个数是:"<<Employee::getCount()<<endl; Employee *test1=new Employee("Ivan","Long"); Employee *test2=new Employee("Esion","You"); cout<<"实例化后的对像个数是:"<<Employee::getCount()<<endl; { Employee *test3=new Employee("Esion2","You2"); } cout<<"实例化后的对像个数是:"<<Employee::getCount()<<endl; }
为什么需要使用delete释放相关后才能够调用析构函数?
何解?能否讲具体一点,谢谢
------解决方案--------------------
用new分配的对象在堆上,必须用delete来释放
------解决方案--------------------
------解决方案--------------------
应该这样说,你在程序里面显式地分配了内存,你就要显式地释放掉,因为程序不知道你什么时候要释放掉。
而在第一例中,每个对象都有确定的作用域,编译器可以帮你完成这件事情。
------解决方案--------------------
当使用Employee test1("Ivan","Long");这种方式创建一个对象时,此对象是一个栈上的对象,栈上的内存是在此函数模块结束时由系统自动释放,那个时刻,对象的析构函数也就自动被调用了。
然而通过Employee *test1=new Employee("Ivan","Long");这种方式创建的对象,它是一个堆上的对象,堆内存的申请和释放都是有程序员自己管理的。所以,当你delete一个对象时,它的析构函数才会被调用。