2 c++
我很好奇解除引用NULL ptr的哪一部分会导致不良行为.例:
// #1
someObj * a;
a = NULL;
(*a).somefunc(); // crash, dereferenced a null ptr and called one of its function
// same as a->somefunc();
// #2
someObj * b;
anotherObj * c;
b = NULL;
c->anotherfunc(*b); // dereferenced the ptr, but didn't call one of it's functions
Run Code Online (Sandbox Code Playgroud)
在这里我们在#2中看到我实际上并没有尝试从b中访问数据或函数,所以如果*b刚解析为NULL并且我们将NULL传递给anotherfunc(),这仍会导致意外行为吗?
标准中有一个空指针值的概念.当程序试图通过它访问内存时,这是一个导致未定义行为的独特值.在实践中,许多现代实现使程序崩溃,这是有用的行为.毕竟,这样的尝试是一个错误.
空指针值的名称是0指针上下文中的任何其他常量整型表达式(例如3 - 3,如).还有一个NULL宏,它必须在C++中评估为0,但可以(void *)0在C中(C++更坚持指针是类型安全的).在C++ 0x中,将调用一个显式值nullptr,最后给空指针一个显式名称.
空指针的值不必是实际的零,虽然它在我所知道的所有实现上,并且那些不起作用的奇怪计算机大部分已经退役.
你错了上一个例子中发生的事情. *b没有解决任何问题.传递*b是未定义的行为,这意味着实现可以用它做任何它喜欢的事情.它可能会或可能不会被标记为错误,并且可能会或可能不会导致问题.行为可以在没有明显原因的情况下改变,因此这样做是错误的.
如果被调用函数期望指针值,则传递空指针值是完全合法的,并且被调用函数应该正确处理它.取消引用空指针值永远不合法.
| 归档时间: |
|
| 查看次数: |
2528 次 |
| 最近记录: |