shared_ptr<void>特别之处在于,通过定义,它将通过调用deletea 来调用未定义的行为void*.
那么,为什么没有shared_ptr<void>抛出编译错误的特化?
使用shared_ptr来保存任意对象
shared_ptr可以充当类似于void*的通用对象指针.当shared_ptr实例构造为:
Run Code Online (Sandbox Code Playgroud)shared_ptr<void> pv(new X);被破坏后,它将通过执行~X正确处理X对象.
该原型的使用方式与原始void*用于临时从对象指针中删除类型信息的方式相同.以后可以使用static_pointer_cast将shared_ptr强制转换回正确的类型.
此构造函数已更改为模板,以便记住传递的实际指针类型.析构函数将使用相同的指针调用delete,完成其原始类型,即使T没有虚拟析构函数,或者无效
shared_ptr<T>特别之处在于它被设计允许保存指向任何可转换为的指针类型的指针,T*并且将使用没有UB的正确删除器!这与shared_ptr<Base> p(new Derived);场景一起发挥作用,但也包括shared_ptr<void>.
例如:
#include <boost/shared_ptr.hpp>
struct T {
T() { std::cout << "T()\n"; }
~T() { std::cout << "~T()\n"; }
};
int main() {
boost::shared_ptr<void> sp(new T);
}
Run Code Online (Sandbox Code Playgroud)
产生输出:
$ ./test
T()
~T()
Run Code Online (Sandbox Code Playgroud)
如果您访问http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm,请向下滚动到分配部分以查看正在演示的内容.有关详细信息,请参阅http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/sp_techniques.html#pvoid.
如trinithis所述编辑,如果传递给构造函数的指针类型是指针,则为 UB void *.感谢您指出了这一点!