zoukankan      html  css  js  c++  java
  • 32、C和C++的类型安全

    什么是类型安全?

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

    (1)C的类型安全:

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

    printf格式输出:

    malloc是C中进行内存分配的函数,它的返回类型是void*即空类型指针,常常有这样的用法char* pStr=(char*)malloc(100*sizeof(char)),这里明显做了显式的类型转换。

    类型匹配尚且没有问题,但是一旦出现int* pInt=(int*)malloc(100*sizeof(char))就很可能带来一些问 题,而这样的转换C并不会提示错误。

    (2)C++的类型安全

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

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

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

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

    4.一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型, 当然改写为模板也能保证类型安全

    5.C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及 更多具体的类型检查。

     

     例2:不同类型指针之间转换

    上面两个例子之所以引起类型不安全的问题,是因为程序员使用不得当。第一个例子用到了空类型指针 void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序的类型安全性,应尽量 避免使用空类型指针void*,尽量不对两种类型指针做强制转换。

  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/crbhf/p/14923248.html
Copyright © 2011-2022 走看看