惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
GRAHAM CLULEY
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
P
Privacy & Cybersecurity Law Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - Franky
Spread Privacy
Spread Privacy
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
The Hacker News
The Hacker News
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
A
Arctic Wolf
Cisco Talos Blog
Cisco Talos Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threat Research - Cisco Blogs
Recorded Future
Recorded Future
Latest news
Latest news
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
C
CERT Recently Published Vulnerability Notes
美团技术团队
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Threatpost
T
The Blog of Author Tim Ferriss
L
LINUX DO - 最新话题
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Secure Thoughts
罗磊的独立博客
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
Cloudbric
Cloudbric
G
Google Developers Blog

博客园 - yijiangchunxue

测试网站和电子书下载网址 glomosim仿真的运行过程 一位软件工程师的6年总结(转) 【转】VC调试篇 【转】C++时间函数 在VC++中生成伪随机数祥解 c++产生随机数 2008年全球人均GDP排行 精选最新优秀源码下载网站排行 堆内存和栈内存区别 assert() 函数用法 C/C++笔试题(1) 华为笔试网络题 华为笔试题及解答 华为C/C++笔试题(5) 华为C/C++笔试题(4) 华为C/C++笔试题(2) 华为C/C++笔试题(1) malloc/free 和 new /delete 的区别
华为C/C++笔试题(3)
yijiangchunxue · 2008-10-22 · via 博客园 - yijiangchunxue

1. 找错

#define MAX_SRM 256

DSN get_SRM_no()
{

static int SRM_no;
    
int I;
    
for(I=0;I<MAX_SRM;I++,SRM_no++)
    {
        SRM_no 
%= MAX_SRM;
        
if(MY_SRM.state==IDLE)
        {
            
break;
        }
    }
    
if(I>=MAX_SRM)
        
return (NULL_SRM);
    
else
        
return SRM_no;
}

答:
(1). SRM_no没有赋初值
(2). 由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为SRM_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉static声明。

2. 写出程序运行结果

int sum(int a)
{
    auto 
int c=0;
    
static int b=3;
    c
+=1;
    b
+=2;
    
return(a+b+C);
}
  
void main()
{
    
int I;
    
int a=2;
    
for(I=0;I<5;I++)
    {
        printf(
"%d,", sum(a));
    }
}

答:8,10,12,14,16

该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。

3.

int func(int a)
{
    
int b;
    
switch(a)
    {
        
case 1: b=30;
        
case 2: b=20;
        
case 3: b=16;
        
default: b=0;
    }
    
return b;
}

则func(1)=?

答:func(1)=0,因为没有break语句,switch中会一直计算到b=0。

4.

int a[3];
a[
0]=0; a[1]=1; a[2]=2;
int *p, *q;
p
=a;
q
=&a[2];

则a[q-p]=?

答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点

5.  定义 int **a[3][4], 则变量占有的内存空间为:_____

答:此处定义的是指向指针的指针数组,对于32位系统,指针占内存空间4字节,因此总空间为3×4×4=48。

6. CObject类中的析构函数为什么是虚函数

面试SE时,很多公司喜欢问到虚函数相关。MFC类库中,CObject类的重要性不言自明的。在CObject的定义中,我们看到一个有趣的现象,即CObject的析构函数是虚拟的。

在AFX.H中,CObject的定义:

class CObject 

public
     
// Object model (types, destruction, allocation)    
     
virtual CRuntimeClass* GetRuntimeClass() const
     
virtual ~CObject(); //virtual destructors are necessary 
      
      
}; 

为什么MFC的编写者认为virtual destructors are necessary (虚拟的析构函数是必要的)?
在著名的VC教程 "精通Visual C++ for Windows 95/NT"(电子工业版, 1997年5月版,胡俭,丘宗明等著)第99页中有这样一段话:
“如果CObject的析构函数不是虚拟的,派生类就不会自动地得到虚拟的   析构函数,当对象撤消时就会带来问题——只有当前类的析构函数得到调用而基类的析构函数就得不到调用...”  
我认为这段解释是这本很不错的书中一个不应出现的严重错误。其意思是说:
若:

class CBase 

   
public
      
~CBase() {  }; 
    
}; 
class CChild : public CBase 

   
public
      
~CChild() {  }; 
    
}; 

main() 

   Child c; 
   

return 0

上段代码在运行时,当栈框中的自动对象 c 被撤消时,只调用~CChild(), 而不调用~CBase()。
我想但凡对C++继承性理论有所了解的人都会立刻指出这是错误的。
由于在生成CChild对象c时,实际上在调用CChild类的构造函数之前必须首先 调用其基类CBase的构造函数,所以当撤消c时,也会在调用CChild类析构函数之后,调用CBase类的析构函数(析构函数调用顺序与构造函数相反)。也就是说,无论析构函数是不是虚函数,派生类对象被撤消时,肯定会依次上调其基类的析构函数。

那么为什么CObject类要搞一个虚的析构函数呢?

仍以上面代码为例,如果main()中有如下代码:
...
CBase * pBase;
CChild c;
pBase = &c;
...

那么在、当pBase指针被撤消时,调用的是CBase的析构函数还是CChild的呢? 显然是CBase的(静态联编)。但如果把CBase类的析构函数改成virtual型,当 pBase指针被撤消时,就会先调用CChild类构造函数,再调用CBase类构造函数。

在这个例子里,所有对象都存在于栈框中,当离开其所处的作用域时,该对象 会被自动撤消,似乎看不出什么大问题。但是试想,如果CChild类的的构造函数在堆中分配了内存,而其析构函数又不是virtual型的,那么撤消pBase时,将不会 调用CChild::~CChild(), 从而不会释放CChild::CChild()占据的内存,造成内存泄露。

而将CObject的析构函数设为virtual型,则所有CObject类的派生类的析构函数都将 自动变为virtual型,这保证了在任何情况下,不会出现由于析构函数未被调用而导致 的内存泄露。这才是MFC将CObject::~CObject()设为virtual型的真正原因。

注意:析构函数可以为virtual型,构造函数则不能。