好的,首先是一些可能相关的事情:
我在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;
}
Run Code Online (Sandbox Code Playgroud)
我原本期望得到以下输出之一:
a)如果两个删除器都被调用,即使指针为空:
"It's now!"
"It's later!"
"It's later!"
Run Code Online (Sandbox Code Playgroud)
b)如果由于指针为空而未调用任何删除器:
"It's now!"
Run Code Online (Sandbox Code Playgroud)
但我没有观察到这些情况.相反,我观察到:
"It's now!"
"It's later!"
Run Code Online (Sandbox Code Playgroud)
这意味着正在调用一个但不是另一个删除者.经过进一步研究,我发现无论是否包含null值,都会调用shared_ptr的删除器,但只有在不包含空值的情况下才会调用unique_ptr的删除器.
我的问题:这实际上是标准规定的正确行为吗?如果是这样,为什么两种STL类型之间的指定行为会以这种方式不同?如果没有,这是一个我应该向libc ++报告的错误吗?