暂时使指针为NULL有什么意义吗?

时间:2013-01-28 19:53:34

标签: c++ c pointers null

我见过很多像这样的代码:

SomeType* ptr = NULL;
ptr = SomeMethod(some, params);

重点是什么?我也看到了ptr在其他地方声明的地方(例如在类定义中),然后在类构造函数中就会出现这样的情况:

ptr = NULL;
ptr = SomeMethod(some, params);

我不明白为什么这样做。当然ptr = NULL行无用吗?

6 个答案:

答案 0 :(得分:34)

如果“SomeMethod”抛出异常,SomeType *将继续指向您不希望它指向的内容。因此,如果您不希望它指向旧的东西,那么将指针设置为null绝对是一个好习惯。

答案 1 :(得分:16)

除了抛出适用于C ++的异常的非常好的点,即使在C中,初始化所有变量也是个好主意。当编译器确定不需要时,编译器几乎总是优化初始化。

以下是一个小例子,说明如果不这样做会发生什么。

SomeType* ptr;
ptr = SomeMethod(some, params);

正如您所看到的那样,ptr没有有效值也没问题。

现在,有人决定添加更多代码是个好主意:

SomeType* ptr;

int x = someotherfunction;

if (x > 90)
{
     ptr = SomeMethod(some, params);
}

现在突然你的ptr会有一些随机的废话内容 - 可能是NULL,但很可能是别的。是的,我们都认为我们会记得检查一下,看看我们的改变是否影响了其他等等。但是如果你已经编程了几年,我几乎可以肯定你曾经有过几例“哎呀,没想到这个”。

想象一下,我添加“其他功能”的新代码改为20或30行,您可以清楚地看到问题所在。

答案 2 :(得分:3)

在第一种情况下,最好在声明新值时始终指定一个值,这样您就不会得到单位化值(保护您免受错误的影响)。但是,如果它是直接相继的,它可以被视为无用。

在第二种情况下,它完全没用。

答案 3 :(得分:2)

确实没用(这被称为“死亡任务”)。但是,有些人更喜欢在声明时分别指向NULL,然后分别明确地指定它。也许这只是出于可读性的原因(也许有些人认为它更具可读性,或者发现即使在例如为调试注释掉赋值时也声明变量很有用)。我不确定我会这样做/认为这是练习。

另请注意,大多数编译器会自动优化分配。

答案 4 :(得分:2)

这种做法不仅没用;这是有害的。如果您刚刚写道:

SomeType* ptr = NULL;
/* lots of stuff in between */
ptr = SomeMethod(some, params);

并且偶然碰巧在干预代码中的某处使用ptr,编译器无法告知您有关此错误的信息。如果你写了:

SomeType* ptr;
/* lots of stuff in between */
ptr = SomeMethod(some, params);

然后在赋值之前使用ptr是UB,一个好的编译器或静态分析工具会告诉你这个错误。

答案 5 :(得分:1)

现在的代码是无用的,但是可能会使用预期未来的维护,在冗余初始化和分配之间将添加更多行,这样初始化就不再是多余的。

代码也可能是删除的结果。也就是说,可能在声明和赋值之间存在一些代码,但是从那时起被删除,并且没有进行清理以将赋值合并到初始化中。当然,代码没有 point 就是这样;在这种情况下,我们只是对它是如何得到这种方式的历史解释(也许是改变它的理由)。

有时看似无用的变量初始化是由于某人不得不使编译器警告“潜在未使用”变量而导致的,如果有多种方法可以到达使用该变量的代码块,则可能会发生这种情况。 ,并且编译器不够复杂,无法证明在所有情况下变量都是通过赋值初始化的。

在声明它们的位置初始化所有变量是一个好习惯,因为它减少了未初始化数据导致不可预测行为的可能性。一些人认为,当未初始化的变量被初始化消除时,某些静态工具的效果会降低,这些初始化会给它们带来不适当的值,从而使得更难找到错误。但是,如果错误基于初始化数据,则错误更多 repeatable ,并且错误行为很可能也是平台之间的 portable 。 有些语言会为您初始化您的本地人。在Lisp中,(let(x)...)表示在代码块...中,变量x具有值NIL,因为没有初始化器。对Lisp代码的静态分析可以很容易地跟踪事实,例如NIL被不适当地传递给数字函数。在C语言和相关语言中,问题略有不同,因为对于类似int的类型,没有等价的错误类型值,例如NIL。因此0被替换,这是一个有效的值,不会简单地炸掉类型不匹配的计算。不合适的0可能导致计算中的算法错误。但是,对于指针,空指针值是NIL的合理传真,因为它是程序员可见的可移植域值,表示“我不指向任何对象”。当指针实际上暂时没有指向任何东西时,我们应该给它这个值,而不是在其中留下可能意外指向非预期对象的随机位。