第4章
1. 书中做了个包装函数,p是第三方库返回的裸指针。此包装函数为了用智能指针包裹以起到自动释放堆内存的目的。但是代码中lambda捕获的this指针只能在类中使用,否则编译报错:
void* p = GetHandle()->Create();shared_ptr<void> Guard(void* p)
{return shared_ptr<void>(p, [this](void* p){GetHandle()->Release(p);}); //compile err
}
去掉this即可。
2. 此外,原先代码中的return shared_ptr<void> sp(p, ...)也是不对的:
shared_ptr<void> Guard(void* p)
{return shared_ptr<void> sp(p, [this](void* p){GetHandle()->Release(p);}); //compile err
}
既然已经return一个临时变量没有必要在声明sp变量名,编译会报错。
额外要注意,void*类型的指针初始化指针指针需要指定删除器,貌似默认的不支持。
还有就是,shared_ptr指定删除器的时候不用显式指定删除器类型,但是unique_ptr则需要:
shared_ptr<void> Guard(void* p)
{return shared_ptr<void>(p, [](void* p){delete p;});
}unique_ptr<void, void(*)(void*)> Guard2(void* p)
{return unique_ptr<void, void(*)(void*)>(p, [](void* p){delete p;});
}
以上。