C++ 在C+中使用对象之前,最好先检查空指针+;?

C++ 在C+中使用对象之前,最好先检查空指针+;?,c++,null,C++,Null,这似乎需要做很多工作;每次使用对象时检查空值 有人告诉我,检查空指针是一个好主意,这样你就不必花时间寻找分段错误发生的地方 只是想知道这里的社区是怎么想的?我认为这是一个调试版本的好主意。 在发布版本中,检查空指针可能会导致性能下降。 此外,在某些情况下,您可以检查父函数中的指针值,并避免检查其子函数。如果您不控制对象,则答案是肯定的。也就是说,如果对象是从您不控制的某个方法返回的,或者在您自己的代码中,您期望(或者可能)某个对象可以为null 它还取决于代码将在何处运行。如果您正在编写客户/用

这似乎需要做很多工作;每次使用对象时检查空值

有人告诉我,检查空指针是一个好主意,这样你就不必花时间寻找分段错误发生的地方


只是想知道这里的社区是怎么想的?

我认为这是一个调试版本的好主意。
在发布版本中,检查空指针可能会导致性能下降。

此外,在某些情况下,您可以检查父函数中的指针值,并避免检查其子函数。

如果您不控制对象,则答案是肯定的。也就是说,如果对象是从您不控制的某个方法返回的,或者在您自己的代码中,您期望(或者可能)某个对象可以为null


它还取决于代码将在何处运行。如果您正在编写客户/用户将看到的专业代码,那么他们通常不会看到空指针问题。如果您可以事先检测到它,并打印出一些调试信息,或者以“更好”的方式向他们报告,这会更好


如果只是非正式使用的代码,您可能不需要任何附加信息就可以理解空指针的来源。

我讨厌检查空指针添加的代码量,因此我只对导出给其他人的函数执行此操作


如果在内部使用该函数,并且我知道如何使用它,我不会检查空值,因为它会使代码变得太混乱。

尽可能使用引用,因为它们不能为空,因此不必检查它们是否为空

在函数参数和其他地方检查null是一种很好的做法,您可能正在处理其他人传递给您的指针。然而,在您自己的代码中,您可能有一些指针,您知道这些指针将始终指向有效的对象,因此空检查可能是过分的。。。用你的常识吧


我不知道它是否真的有助于调试,因为任何调试器都会非常清楚地向您显示使用了空指针,并且不会花很长时间找到它。更重要的是,如果另一个程序员传入NULL,您不会崩溃,或者错误是由调试构建中的断言发现的。

否。您应该首先确保指针没有设置为NULL。请注意,在标准C++中:

int * p = new int;
那么p永远不能为NULL,因为如果分配失败,new将抛出异常

如果您正在编写可以将指针作为参数的函数,那么应该这样对待它们

// does something with p
// note that p cannot be NULL
void f( int * p );
换句话说,您应该记录功能的需求。您还可以使用assert()检查是否有人忽略了您的文档(如果有,这是他们的问题,而不是您的),但我必须承认,随着时间的推移,我已经放弃了这一点-只需说出函数需要什么,并将责任留给调用方


一个第三位的建议就是不使用指针——我所看到的大多数C++代码过度使用指针到了荒谬的程度——你应该尽可能使用值和引用。因为这会使代码更难阅读,而且如果指针实际为空,您还必须想出一些合理的方法来处理这种情况

在我的C++项目中,我只检查指针(如果我使用指针)是否为空,只有当它可以是指针的有效状态时。如果指针实际上不应该为NULL,那么检查NULL就有点毫无意义,因为您正在尝试解决一些编程错误,而应该修复这些错误

此外,当您觉得需要检查指针是否为空时,您可能应该更清楚地定义谁拥有指针/对象


此外,您不必检查
new
是否返回NULL,因为它永远不会返回NULL。如果无法创建对象,它将抛出异常。

如果指针作为函数的参数提供给您,请确保它们在函数开头有效。否则,就没有什么意义了
new
在失败时抛出异常。

我想我可以做大量的空指针检查,只需调试一个segfault

而且性能的影响可以忽略不计。两个指令。寄存器的测试==零,如果测试成功则进行分支。根据机器的不同,如果寄存器加载设置了条件代码(有些设置了条件代码),则可能只有一条指令。

其他指令(AshleysBrain和Neil Butterworth)已正确回答,但我将在这里总结:

  • 尽可能多地使用引用
  • 如果使用指针,则将其初始化为NULL或有效的内存地址/对象
  • 如果使用指针,请在使用它们之前始终验证它们是否为NULL
  • 使用引用(再次)。。。这是C++,不是C.< 不过,有一种情况下引用可能无效/为空:

    void foo(T & t)
    {
       t.blah() ;
    }
    
    void bar()
    {
       T * t = NULL ;
       foo(*t) ;
    }
    
    编译器可能会编译它,然后在执行时,代码将在
    t.blah()
    行崩溃(如果t::blah()以某种方式使用
    this

    尽管如此,这仍然是欺骗/破坏:
    bar()
    函数的编写者在未验证
    t
    的情况下取消了
    t
    的引用。因此,即使崩溃发生在
    foo()
    中,错误也发生在
    bar()
    的代码中,
    bar()
    的编写者负责

    所以,是的,尽可能多地使用参考资料,了解这个极端情况,不要费心去保护被破坏的参考资料


    如果你真的需要在C++中使用指针,除非你是100%确定指针不是空的(一些函数保证了这类事情),然后总是测试指针。< /P>只有知道如何处理它,你才会惊讶于有多少人认为新的返回在失败时是空的。