读书人

析构函数和内存的有关问题

发布时间: 2013-09-06 10:17:17 作者: rapoo

析构函数和内存的问题
1.析构函数和内存有关吗?看到书上写如果不调用析构函数,会造成内存泄露。但我感觉析构函数不具有内存释放的功能吧?(除非自定义)
2.虚析构函数的问题,父类的析构函数定义为虚析构函数,是不是派生类的析构函数也自动变成虚析构函数了?
3.一直有疑惑,派生类的析构函数名称和父类的析构函数名称不一样,定义成虚函数怎样实现多态性呢?

class base
{
virtual ~base(){};
};
class child:public child
{};
void main()
{
child c1;
base *pbase=&c1; //先调用了~child() 再调用了~base
} // 这两个析构函数的名称都不一样,怎样用virtual实现多态?





[解决办法]
1.析构函数和内存有关吗?看到书上写如果不调用析构函数,会造成内存泄露。但我感觉析构函数不具有内存释放的功能吧?(除非自定义)

虚构函数和内存无关。只是如果类包含new/malloc的空间,那么必须自定义虚构函数,对其delete/free。

2.虚析构函数的问题,父类的析构函数定义为虚析构函数,是不是派生类的析构函数也自动变成虚析构函数了?



3.一直有疑惑,派生类的析构函数名称和父类的析构函数名称不一样,定义成虚函数怎样实现多态性呢?

规定。

[解决办法]
我的理解是:
一、析构函数是与内存有关的。如果定义了指针成员,一般需要定义自己的析构函数。如果没有指针成员,只有诸如int等成员,则析构函数会自动处理。
二、继承关系中,是根据对象所属的类进行多态的。因此,是先找对象所属的类,再进行析构(当对象超出作用域时,会自动调用析构函数),而不是根据析构函数的名字。
[解决办法]
1.析构函数里的逻辑是用户自己写的。一般惯用法是释放资源,资源可以是你之前分配的存储。至于析构掉的对象自己的存储的释放,析构函数不应该管(否则delete调用析构以后::operator delete就重复释放了——如果你运气好没折腾成递归不出来的话)。
至于析构机制自己需要的存储,C++不管,你要管用C++也不见得管得着。不过考虑现行体系结构的一般实现,会折腾虚表之类的玩意儿。
2.不限于析构函数,都是。
3.构造函数和析构函数没有名称。你看到的::后面的类名之类的是C++特别约定的声明语法。运行时多态的实现也不需要管名称。至于实现怎么mangle符号的,自己找ABI spec去。



引用:
Quote: 引用:

1.析构函数和内存有关吗?看到书上写如果不调用析构函数,会造成内存泄露。但我感觉析构函数不具有内存释放的功能吧?(除非自定义)
2.虚析构函数的问题,父类的析构函数定义为虚析构函数,是不是派生类的析构函数也自动变成虚析构函数了?
3.一直有疑惑,派生类的析构函数名称和父类的析构函数名称不一样,定义成虚函数怎样实现多态性呢?

可以认为析构函数,和构造函数,都是重载函数,构造函数 名是 ctor,析构函数名是 dtor;



析构函数重载?扯蛋。

读书人网 >C++

热点推荐