类型安全 与 线程安全 、异常安全、事务安全

本文介绍了类型安全的概念,通过C和C++的示例说明了不同类型安全的语言特性,强调了类型安全对于防止内存错误的重要性。接着讨论了线程安全,指出线程安全问题通常由全局变量和静态变量引发,需要考虑线程同步来避免。然后,文章解释了异常安全,强调异常处理应避免资源泄漏和数据破坏,并提供了异常安全函数的三个安全等级。最后,阐述了事务安全,即某些操作在成功执行或完全回滚之间的一个明确状态,通常应用于数据库操作。
摘要由CSDN通过智能技术生成

(1)类型安全

类型安全很大程度上可以等价于内存安全类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。

C语言的类型安全   相当多的操作不是类型安全的

C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非使用显式类型转换。然而,C中相当多的操作是不安全的(例如printf函数和malloc函数)。以下是两个十分常见的例子:

(1)printf格式输出


 int main()

    {

    printf("%d\n",10);

    system("pause");

    return 0;

    }


上面的代码很简单,printf函数中,%d与10匹配,结果正确。

稍作修改:

    int main()

    {

    printf("%f\n",10);

    system("pause");

    return 0;

    }

%f浮点数与10并不匹配,但是编译通过,执行也没报错,但是结果却是:

0.000000

请按任意键继续. . .

更进一步,把%f修改为%s,编译通过,执行将报错Access Violation。

(2)malloc函数的返回值

malloc是C中进行内存分配的函数,它的返回类型是void*即空类型指针,常常有这样的用法char*pStr=(char*)malloc(100*sizeof(char)),这里明显做了显式的类型转换。类型匹配尚且没有问题,但是一旦出现int*pInt=(int*)malloc(100*sizeof(char))就很可能带来一些问题,而这样的转换C并不会提示错误。

 

C++的类型安全   有些操作也不是类型安全的(两个不同类型的指针之间可以强制转换(用reinterpret cast),C#、Java是类型安全的)

如果C++使用得当,它将远比C更有类型安全性。相比于C,C++提供了一些新的机制保障类型安全:

(1)操作符new返回的指针类型严格与对象匹配,而不是void*;

(2)C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;

(3)引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;

(4)一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值