设为首页 加入收藏

TOP

C++ class成员函数的奇葩用法
2014-11-24 10:10:47 】 浏览:5806
Tags:class 成员 函数 奇葩 用法

面试中会有这样的题目,实际项目也有人遭过!是什么呢,就是类对象被释放后,还可以访问class成员函数,因为编译过了,运行中没有check null就会直接调用,下面我们可以看看奇葩的两种用法。

#include 
  
     
  
class test{  
    public:  
        void print(){  
            printf("%s\n",__FUNCTION__ );  
        }
   
#include 
    
       
  
class test{  
    public:  
        test():m_Val(0){  
        }  
        void print(){  
            printf("%s\n",__FUNCTION__ );  
        }  
        void funusemem(){  
            printf("%s\n",__FUNCTION__ );  
            printf("m_Val is :%d\n", m_Val);  
        }  
    private:  
        int m_Val;  
};   
  
int main(){  
    test* p = new test;  
    delete p;  
    p = NULL;  
    int* m = new int;  
    ((test*)m)->funusemem();  
    p->funusemem();  
    return 0;  
}
    

他们都成功调用了print函数.

那再让我们看看另外一种会挂掉的用法:

#include 
    
     

class test{
	public:
		test():m_Val(0){
		}
		virtual void print(){
			printf("%s\n",__FUNCTION__ );
		}
		void funusemem(){
			printf("%s\n",__FUNCTION__ );
			printf("m_Val is :%d\n", m_Val);
		}
	private:
		int m_Val;
}; 

int main(){
	test* p = new test;
	delete p;
	p = NULL;
	int* m = new int(1998);
	((test*)m)->funusemem();
	p->funusemem();
	return 0;
}
    

第一个仍然不会挂,第二个会挂,特么很诡异吧,第二个挂的原因是this指针为NULL会segmentation fault.

第一个不仅不会错误,而且输出了1998,哈哈,这就是C++ class的调用机制,你看到木有,因为这里没有virtual table,所以第一个mem直接是*(int*)this,所以这里不会有问题,如果有虚函数肯定就会错!(这个已测试)

所以C++坑还是比较多的,可以多踩踩,特么才知道oh shit!

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇poj 2240-Arbitrage Bellman-ford.. 下一篇POJ 1436 Horizontally Visible S..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目