Добрый день. Я хотел бы узнать как компилятор понимает что нужно вызвать конструктор объекта, если в программе объект объявлен через указатель и в некоторой функции под него выделяется память (по оператору new..?). Затем. Если я не использую стандартных либ и выделяю память при помощи, скажем, LocalAlloc - конструктор объекта не вызывается (!). Как тут быть? Можно ли вызывать конструктор принудительно?
MyObject *pObj = new MyObject(); транслируется примерно в такое: Код (Text): push sizeof(MyObject) call operator new mov ecx, eax call MyObject::MyObject mov [pObj], eax Если память выделял сам, то можно вызывать т.н. placement new: Код (Text): void* buf =LocalAlloc(sizeof(MyObject)) MyObject *pObj = new (buf) MyObject(); Деструктор тогда вызывается так: Код (Text): pObj->~MyObject(); LocalFree(buf); Вот тут ещё инфы: http://www.parashift.com/c++-faq-lite/dtors.html
Пасиб. Хорошо. А оператор new у меня вызовется, если нет стандартных либ? компилятор или линкер не потребуют каких-нибудь либ? Есть ещё вопросик. если в конструкторе происходит ошибка, то по идее нужно бы освободить память. То есть конструктор как-то должен сообщить об этом программе. как это можно сделать? Я спрашивал у своего препода-гражданина. Он говорит, мол, нужно вызывать исключение.
А перегрузить new/delete не проще ? Код (Text): void* operator new(unsigned int sz) { return GlobalAlloc(GPTR, sz); } void operator delete(void* p) { if (p) GlobalFree(p); }
Хех.. и вправду проще. Я почему-то думал (где-то читал) что new перегружить нельзя. На моё удивление даже конструктор вызывается ))