#include <iostream>
using namespace std
/**********************************
//project ->Properties ->C/C++ ->Code Generation -->Enable C++ Exceptions
//选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到空指针,内存越界,0除异常
//默认是选择Yes (/EHsc)
**********************************/
void TestIntType()
{
try
{
throw 1
}
catch(...)
{
cout<<"在 try block 中, 准备抛出一个异常." <<endl
}
}
void TestDoubleType()
{
try
{
throw 0.5
}
catch(...)
{
cout<<"在 try block 中, 准备抛出一个异常." <<endl
}
}
void TestEmptyPointType()
{
try
{
int* p = NULL
*p = 3
}
catch(...)
{
cout<<"非法地址 *** 作异常" <<endl
}
}
void TestDivZeroType()
{
try
{
int b = 0
int a = 3/b
}
catch(...)
{
cout<<"0除异常" <<endl
}
}
void TestMemoryOutType()
{
int * a = new int[4]
try
{
for (int i = 0i<245i++)
{
a++
}
*a = 3
}
catch(...)
{
cout<<"内存越界异常" <<endl
}
}
int main(int argc, char* argv[])
{
TestEmptyPointType()
//TestDivZeroType()
TestMemoryOutType()
return 1
}
这个问题,实际上在今天的JulianTec adil 邮件列表中有人问到了。 yihe chen 给出了答案:这个问题得从指针说起。。
C语言里面的指针可以指向任何有效的数据,也可以
不指向任何东西;这后者即所谓的NULL指针。
指向有效数据的时候,对它使用*做dereference *** 作
就可以取出数据来了;但是对不指向任何数据的指针
来进行* *** 作肯定就没什么意义了,对吧?这其实是个
bug。
在现代的 *** 作系统设计中,为了消除程序里面的这种
bug,故意分配一个专门的不能访问的内存页,然后
将NULL指针安排在里面。这样当程序员不小心在自己
的程序中写下对NULL指针的提领 *** 作后,系统运行时
就会报错。
在windows和linux中,这样的内存页被设计者安排在
0地址开始对应的那个页上。实际上,这个页面里面
的任何地址都是不能被提领的。*((char *)0) 不可以,
*((char *)0x12)之类的地址也不可以。
很多人认为NULL指针其实就是指向0地址的指针,实际
上这是不准确的。虽然很少见,但也有处理器架构将
NULL指针安排在非零地址起始的页面内。所以为了程
序的可移植性,在需要使用NULL指针的时候,用null
而来不用0值来初始化指针变量。
你可以访问这里的归档:http://www.juliantec.info/mlist/archives/index.html
但是今天的,没这么快归进去,你可以访问这里的记录:
http://www.freelists.org/post/juliantec_list/char-0,1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)