先贴上代码:
#include <memory>
#include <iostream>
auto unique_deleter = [](int* p) {
std::cout << "unique_ptr delete:" << *p << "\n";
delete p;
};
auto shared_deleter = [](int* p) {
std::cout << "shared_ptr delete:" << *p << "\n";
delete p;
};
auto shared_deleter_check_nullptr = [](int* p) {
if (p != nullptr)
{
std::cout << "shared_ptr2 delete:" << *p << "\n";
delete p;
}
else
{
std::cout << "shared_ptr2 is null\n";
}
};
int main()
{
{
// unique_ptr == nullptr, 删除器没有被调用
std::unique_ptr<int, decltype(unique_deleter)> pUniquePtr(nullptr, unique_deleter);
// unique_ptr != nullptr, 删除器被调用
std::unique_ptr<int, decltype(unique_deleter)> pUniquePtr2(new int(5), unique_deleter);
// shared_ptr == nullptr, 删除器仍然被调用, 幸好对"nullptr"有检查
std::shared_ptr<int> pSharedPtr(nullptr, shared_deleter_check_nullptr);
// shared_ptr != nullptr, 删除器被调用
std::shared_ptr<int> pSharedPtr2(new int(10), shared_deleter);
// shared_ptr == nullptr, 删除器仍然被调用, 没有对"nullptr"的检查, 程序崩溃
//std::shared_ptr<int> pSharedPtr(nullptr, shared_deleter);
}
getchar();
}
测试环境: win10 64bit g++4.9.2 --std=c++1y
通过测试发现, 当std::unique_ptr为nullptr时, 自定义删除器不会被调用, 而std::shared_ptr为nullptr时, 自定义删除器仍然会被调用, 这就要求, 当定义ared_ptr的删除器时,
需要对is nullptr作检查, 而unique_ptr就不需要, Why? Why? Why?