【发布时间】:2014-06-08 00:32:39
【问题描述】:
我试图了解boost::make_shared 如何为boost::shared_ptr 管理的对象和引用计数对象(shared_ptr 使用)一起分配内存。
make_shared 函数从这里开始执行:
template< class T, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
{
//Seems to create the smart_ptr for the object
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
//Not sure?
boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
//Calculates the address at which the bulk-allocation begins
void * pv = pd->address();
//Allocates the memory at address pv?
::new( pv ) T(
boost::detail::sp_forward<A1>( a1 ),
boost::detail::sp_forward<A2>( a2 ),
boost::detail::sp_forward<A3>( a3 )
);
//Not sure
pd->set_initialized();
//Not sure
T * pt2 = static_cast< T* >( pv );
//Not sure
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
return boost::shared_ptr< T >( pt, pt2 );
}
有人能帮忙解释剩下的几行吗?
我试图确定大容量内存分配的大小(指向和 shared_ptr 引用计数对象的对象)的大小是在哪里确定的?
让我感到震惊的是,在分配要分配的地址时,对address() 的调用似乎没有考虑T 对象的大小。
(我真的不明白这三个AX参数是什么进入方法并传递给放置new()调用)
【问题讨论】:
标签: c++ memory-management boost shared-ptr make-shared