首页 > 编程知识 正文

c析构函数怎么写,析构函数和构造函数的作用

时间:2023-05-03 07:36:57 阅读:27194 作者:1974

c的虚析函数的必要性结构函数不能是虚函数虚析函数的原理分析

C程序员经常遇到的问题是内存泄漏,如果操作错误导致内存泄漏,就会造成灾难性错误。 在继承中,大多数基类的析构函数通常被声明为伪函数。 这样就不会释放指针占用的堆内存,从而防止发生内存泄漏。

# includeiostreamusingnamespacestd; class people { public : people * char * name _ parameters,int age_parameters; 人(constpeoplepeople ); ~People (; 虚拟语音显示(; char *get_name (; int get_age (; 隐私: char * name; int age; (; people :3360 people (char * name_parameters,int age_parameters ) :name ) name _ parameters ), age_parameters ) ) age _ parameters } people :3360 people (constpeoplepeople ) ) cout ' peoplecopyconstructedisused }People:~People () cout ' peopledestructedisused ' endl; }int People:get_age () { return this-age; }char *People:get_name () { return this-name; }void People:display () { cout 'name:' name ),age:' age endl; } class teacher : public people { public : teacher (char * name,int age,int salary ); ~Teacher (; 语音显示(; int get_salary (; 隐私: int salary; (; teacher :3360 teacher (char * name,int age,int salary ) : people (name,age ),salary ) cout ' teacher cher } teachery } int teacher : get _ salary () { return this-salary; } void teacher 3360: display ((cout ' name 23360 ' get _ name )、age:' get_age ) ) salary 3360 ' salary } int mamimage ptr=newteacher('child ',10,1000 ); 删除ptr; 返回0; } : peopleclassconstructediscreatedpeopleclassconstructedpeopleclassconstructediscreatedpeopledestructedisused 因为没有使用,所以当delete调用基类析构函数释放内存时,派生类对象生成的堆内存不会被释放,更容易发生内存泄漏。 那么为什么不调用派生类的析构函数呢? 其中函数是非虚函数,因此通过指针访问非虚函数时,编译器将根据指针类型访问析构函数。 如果当前指针类型为People,则只能调用People的析构函数而不调用虚函数。 将基类析构函数声明为虚拟析构函数。

# includeiostreamusingnamespacestd; class people { public : people * char * name _ parameters,int age_parameters; 人(constpeoplepeople ); 虚拟~人员(; 虚拟语音显示(; 查尔斯

*get_name(); int get_age();private: char *name; int age;};People::People(char *name_parameters, int age_parameters) : name(name_parameters), age(age_parameters) { cout << "people class constructed is created" << endl;}People::People(const People &people) { cout << "people copy constructed is used" << endl; }People::~People() { cout << "people destructed is used" << endl; }int People::get_age() { return this->age; }char *People::get_name() { return this->name; }void People::display() { cout << "name:" << name << ",age:" << age << endl; }class Teacher : public People {public: Teacher(char *name, int age, int salary); ~Teacher(); void display(); int get_salary();private: int salary;};Teacher::Teacher(char *name, int age, int salary) : People(name, age), salary(salary) { cout << "Teacher class constructed is created" << endl;}Teacher::~Teacher() { cout << "Teacher destructed is used" << endl; }int Teacher::get_salary() { return this->salary; }void Teacher::display() { cout << "name2:" << get_name() << ",age:" << get_age() << "salary:" << salary << endl;}int main() { People *ptr = new People("people", 20); ptr = new Teacher("child", 10, 1000); delete ptr; return 0;} 输出:people class constructed is createdpeople class constructed is createdTeacher class constructed is createdTeacher destructed is usedpeople destructed is used

通过上述程序的修改,声明基类的虚析构函数之后,delete掉基类的指针,会调用派生类的析构函数和基类的析构函数释放内存。因为虚函数不会在意指针的类型,而是观察指针指向的对象,根据指针指向的对象来调用成员(成员变量和成员函数)。也就是说,指针指向哪个对象,就调用哪个对象的成员。指针ptr指向了派生类的对象,那么在释放内存时会优先调用派生类的析构函数,再根据delete机制调用基类的析构函数,这样就解决了内存泄漏的问题。

构造函数不能是虚函数

主要有两个原因:

派生类不能继承基类的构造函数,因此把基类的构造函数声明为虚函数没有意义,无法实现多态;

c++中的构造函数用来在创建对象时进行初始化工作,在执行构造函数的时候,对象尚未创建完成,虚函数表这个时候还不存在, 也没有指向虚函数表的指针,所以此时还无法查询虚函数表。也就不知道调用哪一个构造函数。

虚析构函数的原理分析 由于基类的析构函数为虚函数,所以派生类会在所有属性的前面形成虚表,而虚表内部存储的就是基类的虚函数。当delete基类的指针时,由于派生类的析构函数与基类的析构函数构成多态,所以得先调动派生类的析构函数;之所以再调动基类的析构函数,是因为delete的机制所引起的,delete 基类指针所指的空间,要调用基类的析构函数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。