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

 更新时间:2014年07月18日 18:13:08   投稿:shichen2014  
这篇文章主要介绍了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语言中用栈实现表达式求值的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • APUE笔记之:进程环境详解

    APUE笔记之:进程环境详解

    本篇文章是对APUE 进程环境详解进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ 栈和队列的实现超详细解析

    C++ 栈和队列的实现超详细解析

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-03-03
  • c语言 树的基础知识(必看篇)

    c语言 树的基础知识(必看篇)

    下面小编就为大家带来一篇c语言 树的基础知识(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C++ 中友元函数与友元类详解

    C++ 中友元函数与友元类详解

    这篇文章主要介绍了C++ 中友元函数与友元类详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • c++智能指针unique_ptr的使用

    c++智能指针unique_ptr的使用

    本文主要介绍了c++智能指针unique_ptr的使用,与shared_ptr作用类似,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C语言函数指针详解

    C语言函数指针详解

    大家好,本篇文章主要讲的是C语言函数指针详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C语言模拟实现学生学籍管理系统

    C语言模拟实现学生学籍管理系统

    这篇文章主要为大家详细介绍了C语言模拟实现学生学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 一文带你深入了解Qt中的顺序容器类与关联容器类

    一文带你深入了解Qt中的顺序容器类与关联容器类

    Qt中也有很多容器类,他们在存取速度、内存开销等方面进行了优化,使用起来更轻量级、更便捷,下面就跟随小编一起来学习一下它们的具体使用吧
    2024-04-04
  • C++中的内存分区介绍

    C++中的内存分区介绍

    这篇文章主要介绍了C++中的内存分区介绍,C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区,本文分别对他们一一说明,需要的朋友可以参考下
    2015-07-07

最新评论