new کردن عجیب و صدا زدن نوع template - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

new کردن عجیب و صدا زدن نوع template

+1 امتیاز

این کد یعنی چی ؟

template<class _Ty1> inline
void _Construct(_Ty1 *_Ptr)
{	
	void *_Vptr = _Ptr;

	::new (_Vptr)_Ty1();
}

کد بالا از هدر xmemory.h ویژوال استودیو هستش .

خط 

::new (_Vptr)_Ty1();

دقیقا چکار می کنه ؟ مگه میشه  نوع template رو هم call کرد ؟

سوال شده شهریور 5, 1393  بوسیله ی OptiMan (امتیاز 124)   2 9 16
دوباره تگ گذاری شد شهریور 5, 1393 بوسیله ی BlueBlade

1 پاسخ

+3 امتیاز
 
بهترین پاسخ

به اون placement new میگن .

کارش اینه که شما یک اشاره گر حافظه بهش میدید اون سازنده کلاس رو در اون محل  صدا میزنه .

 کد زیر رو در نظر بگیرید :‌

	void* ptr = ::operator new(sizeof(A));
	::new(ptr)A();

کد بالا معادل این هست :‌

A* ptr=new A;

تابع template ای هم که نوشتید دقیقا همین کار رو انجام میده البته قسمت new کردن قبل از صدا زدن تابع انجام شده و اشاره گر به حافظه new شده که همون _Ptr هست به تابع فرستاده میشه .

کاربردی هم که این سبک new کردن  داره اینه که با  این روش شما می تونین توابع مربوط به گرفتن حافظه رو از قسمت مربوط به صدا زدن سازنده جدا کنید .

 که هم داخل allocator های container های ++C ازش استفاده شده .

و هم با  استفاده از این روش میشه  memory pool   نوشت .

 

پاسخ داده شده شهریور 5, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد شهریور 5, 1393 بوسیله ی Ali Rahbar
...