2016-03-21 15 views
0

Bunu sorduğum için biraz aptal hissediyorum ama yeni anahtar kelimeyi kullanamadığım bir durum var. Utf8Buffer değişkeninin işaret ettiği nesne için yapıcının çağrıldığından emin olmalıyım, bir örnek aşağıda yer almaktadır.Gerçekte ctor mu arıyor ve vtable'ı bir nesneye bir işaretçi üzerinde mi başlatıyorum? C++

Utf8String * pUtf8Buffer; 
    void Initialize(void * stringbuffer, size_t bufferlen) 
    { 
     pUtf8Buffer = (Utf8String*)this->pMemMan->AllocMem(sizeof(Utf8String)); 
     //In the line below am I calling ctor of the object pointed to by the Utf8Buffer 
     //I specifically need ctor to be called on this object to initialize the vtable 
     (*pUtf8Buffer) = Utf8String(stringbuffer, bufferlen); 
    } 
+0

Özel ayırıcıların varsayılan olarak yapıcıyı arayacağını düşünmüyorum. Bu malloc için de aynısı. – Mahesh

cevap

1

yerine placement new gerekir: Yapıcı atarsa ​​

pUtf8Buffer = (Utf8String*)this->pMemMan->AllocMem(sizeof(Utf8String)); 

new (pUtf8Buffer) Utf8String(stringbuffer, bufferlen); 

Ve tabii

, Bellekte gerekir. Bu nedenle, biraz daha fazla güvenlik ile bu gibi bir try/catch bloğu ekleyin:

void* pRawBuffer = this->pMemMan->AllocMem(sizeof(Utf8String)); 

try { 
    pUtf8Buffer = new (pRawBuffer) Utf8String(stringbuffer, bufferlen); 
} catch (...) { 
    pUtf8Buffer = nullptr; 
    this->pMemMan->ReleaseMem(pRawBuffer); 
    throw; 
} 
+0

Aslında denemeyi ve yakalamayı da kullanamıyorum, bu sadece bir kopya ve yapıştırma örneğiydi, gerçek kod açıkçası bende bellek ayırma işleminin benim örneğimde başarılı olduğundan emin olmak istiyorum. Neyse ki benim uygulamalarımda, kurucuların herhangi bir hata atmama garantisi vardır. Teşekkür ederim, yeni yerleşimi hiç bilmiyordum. Kullandığım yöntemi kullanmak, vtables'leri başlatmaz ve sizinkileri yapar. –

İlgili konular