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

Ber*_*een 24 c c++ null pointers

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

SomeType* ptr = NULL;
ptr = SomeMethod(some, params);
Run Code Online (Sandbox Code Playgroud)

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

ptr = NULL;
ptr = SomeMethod(some, params);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这样做.当然这ptr = NULL条线路没用?

小智 34

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

  • 这仅适用于C++**.** (15认同)
  • 这仅适用于C++中的*assignment*.在初始化的情况下,将退出指针变量的范围,并且可能的未初始化值不是问题. (6认同)
  • ...在赋值的情况下,你不得不想知道为什么在创建新指针之前丢弃旧指针.对于异常安全的代码来说,这是一个糟糕的设计.相反,分配新的指针(在异常上没有任何改变),然后交换指针(不能抛出),然后取消分配旧对象(不能抛出).因此,您要么具有旧状态,要么具有新状态,但从不使用NULL指针. (2认同)

Mat*_*son 16

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

这里有一个例子,说明如果不这样做会发生什么.

SomeType* ptr;
ptr = SomeMethod(some, params);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这样可以正常工作,没有ptr有效值也没问题.

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

SomeType* ptr;

int x = someotherfunction;

if (x > 90)
{
     ptr = SomeMethod(some, params);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我认为比较讨论是Kerrek SB在评论中提到的方法,"SomeType*ptr = SomeMethod(some,params);`",而不是让`ptr`取消分配. (2认同)