现在的位置: 首页 > 综合 > 正文

面试问题

2013年11月05日 ⁄ 综合 ⁄ 共 1305字 ⁄ 字号 评论关闭

腾讯面试时候的几个问题,记在这里,先写两个,然后慢慢写,O(∩_∩)O~

1、首先是笔试的时候就出现过的一道题,面试的时候又让我做,才发现笔试的时候就想错了。有如下代码:

问程序结束后count的值为多少?这个题关键是x=x&(x-1)这句。这个其实是Hacker's Delight一书中介绍的一个经典算法,原文如下:

Use the following formula to turn off the rightmost 1-bit in a word, producing 0 if none (e.g., 01011000 ==> 01010000).

其实就是用来计算二进制位中有多少个1,每进行一次x&(x-1),则把最后一个1置为0。可以用此性质来判断一个无符号数是不是2的n次方。

2、当基类中有虚函数时,最好把其析构函数也定义为虚函数。

来看一下的代码

程序运行结果如下:

Untitled

可以看到delete基类的时候,先析构了子类,然后析构基类。但如果把基类析构函数的vitual拿到,那么程序直接析构基类,而不会析构子类。

因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。

此外还应注意的是:

(1)析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。

(2)多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。

抱歉!评论已关闭.