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)已正确回答,但我将在这里总结:
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>只有知道如何处理它,你才会惊讶于有多少人认为新的返回在失败时是空的。