好的,首先是一些可能相关的事情:
我在 C++11 模式下使用 Clang 3.1 编译器,标准库设置为 libc++。
我正在尝试让自己熟悉 C++11,在这样做的过程中,我遇到了看起来很奇怪的行为。这可能是 Clang 或 libc++ 的一个怪癖,但我不会说 C++ 标准语言,而且我无法访问其他支持 C++11 的编译器,所以我无法真正检查它,我已经搜索了互联网和 Stack Overflow尽我所能,没有找到任何相关的东西……所以我们开始吧:
当使用 shared_ptr / unique_ptr 为简单资源实现 RAII 时,它们的行为似乎在删除时针对空指针而有所不同。我意识到通常没有必要删除空指针,但我曾期望该行为至少在两个 STL 智能指针之间匹配。
对于特定情况,请考虑以下代码:
{
auto Deleter = [](void *){cout << "It's later!" << endl;};
shared_ptr<void> spDoSomethingLater(nullptr, Deleter);
unique_ptr<void, void (*)(void *)> upDoSomethingLater(nullptr, Deleter);
cout << "It's now!" << endl;
}
我本来期望从中得到以下输出之一:
a) 如果两个删除器都被调用,即使指针为空:
"It's now!"
"It's later!"
"It's later!"
b) 如果因为指针为空而没有调用删除器:
"It's now!"
但我没有观察到这两种情况。相反,我观察到:
"It's now!"
"It's later!"
这意味着正在调用一个而不是另一个删除器。经过进一步调查,我发现shared_ptr的删除器被调用,无论它是否持有空值,但unique_ptr的删除器只有在它不持有空值时才会被调用。
我的问题:这实际上是标准规定的正确行为吗?如果是这样,为什么两种 STL 类型之间的指定行为会以这种方式有所不同?如果不是,这是我应该向 libc++ 报告的错误吗?