如何处理空指针问题

3
3个回答

13

它立即返回而不执行任何操作。

根据第7.20.3.2段的第3段:

该自由函数导致指针ptr指向的空间被释放,即为进一步分配提供了可用空间。如果ptr是null指针,则不执行任何操作。否则,如果参数与之前由calloc、malloc或realloc函数返回的指针不匹配,或者如果空间已通过调用free或realloc释放,则其行为未定义。


1
我很高兴他们将标准行为更改为这样。我记得以前所有的free调用都是宏,将free调用包装在对NULL的测试中。 - Martin York
标准一直要求 free 以这种方式运作。丑陋的包装器要么基于城市传说,要么是为了支持某些损坏的非标准伪C实现。 - R.. GitHub STOP HELPING ICE
很有可能是真的。但我比标准更老。自从第一个C标准N1191990年6月18日发布以来,我就开始使用C语言了,而我们使用的版本中绝对没有空指针问题。 - Martin York

3

man page中写道:

free()函数释放ptr所指向的内存空间,这个指针必须是之前通过调用malloc()、calloc()或realloc()返回的。否则,如果之前已经调用了free(ptr),或者ptr为NULL,则会发生未定义的行为。

如果ptr为NULL,则不执行任何操作。


请记住,man手册不是规范性的,通常具有POSIX特定的扩展。它们不应被视为标准行为的参考。 - Billy ONeal
哦,亲爱的。是否有一组规范的不同文档? - Jeremy Friesner
手册页从未成为规范性文件。对于C和C ++,各自的ISO / IEC标准是规范性文件。对于POSIX,POSIX标准本身是规范性文件。手册页描述了您特定的计算机(可能)的工作方式,但不描述如何在不同计算机间实现标准行为。(手册页通常在适当的位置附近引用实际的规范性标准) - Billy ONeal

1

free(ptr) 如果 ptrNULL,则不应执行任何操作。

在实际编程中,此功能有助于使您的代码更加简单,如下所示:

class YourClass
{
public:

YourClass()
{
    m_ptr = (int*)malloc(sizeof(int));

    //Validate m_ptr and perform other initialization here
}

~YourClass()
{
    // You don't have to validate m_ptr like this
    // if (m_ptr)
    // {
    //     delete m_ptr;
    // }

    // Instead, just call free(m_ptr)
    // Notice: generally you should avoid managing the pointer by yourself,
    // i.e., RAII like smart pointers is a better option.
    free(m_ptr);
}

private:

int *m_ptr;
}

我可以建议您使用auto_ptr来代替吗? - Billy ONeal
2
不要编写自己的智能指针,这比你想象的要困难得多。当然,这个版本失败了,因为你没有遵循三大法则。但是我参加了Scott Meyers的一次演讲,在他的一本书中描述了他尝试创建智能指针的经历。即使在多次同行评审后出版,他仍然收到电子邮件,反映它不能完美地工作的情况。 - Martin York
是的,在大多数情况下,您应该使用智能指针而不是重新发明轮子。但是当您必须自己完成时,那就是有用的知识。我会更新我的答案,感谢两位。 - Eric Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接