当前位置: 首页 > 编程笔记 >

C语言new操作的安全性分析

程振濂
2023-03-14
本文向大家介绍C语言new操作的安全性分析,包括了C语言new操作的安全性分析的使用技巧和注意事项,需要的朋友参考一下

对于学习过C语言的朋友应该都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到new上,那可就不一定正确了。我经常看到类似这样的代码:

int * p = new int [MAXSIZE]
if (p == 0) // 检查p指针是否为空
return -1;
//other code

其实,这里的 if ( p == 0 ) 完全没有意义的。C++ 里,如果 new 分配内存失败,默认是抛出异常的。所以,如果分配成功,p == 0 就绝对不会成立;而如果分配失败了,也不会执行 if ( p == 0 ),因为分配失败时,new 就会抛出异常跳过后面的代码。如果你想检查 new 是否成功,应该捕捉异常:

try
{
int * p = new int [MAXSIZE]
}
catch( bad_alloc & exp)
{
cerrr<<exp.what()<<endl;
}

但是 有的程序员并不习惯捕捉异常,标准C++也提供了一种方法不抛出异常而返回空指针。

int * p = new (std::nothrow)int [MAXSIZE]
if (p == 0) // 检查p指针是否为空
return -1;
//other code
 类似资料:
  • 本文向大家介绍C语言安全编码之数值中的sizeof操作符,包括了C语言安全编码之数值中的sizeof操作符的使用技巧和注意事项,需要的朋友参考一下 通常来说获取数组的长度时不要对指针应用sizeof操作符。 现来看看下面这段代码: clear()使用sizeof(array) / sizeof(array[0])这种用法确定这个数组的元素数量,但由于array是一个形参,因此它是指针类型,size

  • 本文向大家介绍C语言安全编码数组记法的一致性,包括了C语言安全编码数组记法的一致性的使用技巧和注意事项,需要的朋友参考一下 对C语言程序来说,在同一文件中时,void func(char *a);  和  void func(char a[]); 完全等价 但在函数原型之外,如果一个数组在一个文件中声明为指针,在另一个不同的文件中声明为数组,那么它们是不等价的 示例代码如下: 解决方案如下:

  • 指针运算符加减标签操作 指针作为一种特殊的变量,它的运算和普通变量是有一定区别的。指针在运算中并没有具备其它变量所有的性能。我们只是给大家介绍一些指针常用的运算: 加法运算(+,++) 我们知道一个整型的变量可以为它做加法运算,那么指针变量加1之后是一个地址还是一个整型? int *p=xxx; [0x12] //有一个int类型的指针,它的指针变量存储的地址为0x12。 p=p+1; 由于p是

  • 本文向大家介绍Objective-C语言块作为属性,包括了Objective-C语言块作为属性的使用技巧和注意事项,需要的朋友参考一下 示例 分配时,由于selfretains blockProperty,block不应包含对self的强引用。这些相互强引用被称为“保留周期”,将防止释放任何一个对象。 这是极不可能的,但self可能会在执行过程中的某个位置释放到块中。在这种情况下,weakSelf

  • 问题内容: 很快我将开始使用共享内存研究并行版本的网格细化算法。 该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不知道线程。 我搜索了这个问题,答案取决于编译器(有些尝试是对线程 有所 了解的)和平台(如果编译器使用的系统调用是否是线程安全的)。 那么,在Linux中,gcc 4编译器会为新运算符生成线程安全代码吗? 如果不是,克服此 问题 的最佳方法是什么?也许将每个呼叫锁

  • 什么是WSDL操作安全? 操作安全是一个布尔标志,可以添加到抽象接口中的操作。 此安全标志将指示此操作是否安全。 WSDL 2.0核心语言中未定义操作安全性。 因此它被添加为WSDL 2.0扩展的一部分。 因此要使用操作安全标志,按照以下步骤: 在元素中添加WSDL 2.0扩展名称空间前缀: 将属性添加到元素中的属性: