4Manuals

  • PDF Cloud HOME

C ++ *&和null验证 Download

    获取Hough线的交点OpenCV C ++ 如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? 为什么System.Net.Mail.MailAddress构造函数在域部分中解析带有斜杠“ /”的电子邮件? Android 10,API29:在应用程序文件夹中使用C ++库编写文件会使应用程序崩溃 Unity-LineRenderer没有出现在版本(2D)上 按下按钮后,电话中未显示通知 ASP.net,使用WebConfig httpErrors重定向到区域内的控制器不起作用 获取会议室详细信息 我们如何将参数Line转换为Station? 网络核心:查找实体框架核心的主键和反射

说我具有以下功能:

void destroy(Song* song) {
    if (song)
        delete song;
}

可以将实现更改为以下内容,以删除null验证吗?

void destroy(Song*& song) {
    delete song;
}

如果是,为什么?

2 个答案:

答案 0 :(得分:5)

您无需检查是否为null,null指针上的delete有效且不执行任何操作。

请参见Is it safe to delete a NULL pointer?


如果我们假设空指针上的delete无效,那么您对destroy的第二种实现将无法工作,因为用户仍然可以执行以下操作:

Song* p = nullptr;
destroy(p);

答案 1 :(得分:2)

从C ++标准(删除8..3版)

  
      
  1. ...在第一个替代项(删除对象)中,操作数的值   delete可以是空指针值,是指向非数组对象的指针   由先前的new表达式创建,或指向子对象的指针   (4.5)表示此类对象的基类(第13条)。如果不,   行为是不确定的。 在第二个备选方案(删除数组)中,   delete操作数的值可以为空指针值或   先前数组new-expression.83产生的指针值
  2.   

Sp对空指针的检查是多余的。对于C函数free同样有效。



Similar searches
    前5000秒后无法保存 如何在ConfigureServices中将记录器实例传递给我的自定义ModelBinderProvider? 在CSS通配符选择器中使用“-”(正式)是否会导致匹配问题? 尝试滚动浏览CT切片 有没有办法获取Google Cloud SQL故障转移副本实例的详细信息?