Конструкторы-деструкторы.

Тема в разделе "LANGS.C", создана пользователем Quark, 30 ноя 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Добрый день.

    Я хотел бы узнать как компилятор понимает что нужно вызвать конструктор объекта, если в программе объект объявлен через указатель и в некоторой функции под него выделяется память (по оператору new..?). Затем. Если я не использую стандартных либ и выделяю память при помощи, скажем, LocalAlloc - конструктор объекта не вызывается (!). Как тут быть? Можно ли вызывать конструктор принудительно?
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    MyObject *pObj = new MyObject();
    транслируется примерно в такое:
    Код (Text):
    1. push sizeof(MyObject)
    2. call operator new
    3. mov ecx, eax
    4. call MyObject::MyObject
    5. mov [pObj], eax
    Если память выделял сам, то можно вызывать т.н. placement new:
    Код (Text):
    1. void* buf  =LocalAlloc(sizeof(MyObject))
    2. MyObject *pObj = new (buf) MyObject();
    Деструктор тогда вызывается так:
    Код (Text):
    1. pObj->~MyObject();
    2. LocalFree(buf);
    Вот тут ещё инфы: http://www.parashift.com/c++-faq-lite/dtors.html
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Пасиб.
    Хорошо. А оператор new у меня вызовется, если нет стандартных либ? компилятор или линкер не потребуют каких-нибудь либ?
    Есть ещё вопросик. если в конструкторе происходит ошибка, то по идее нужно бы освободить память. То есть конструктор как-то должен сообщить об этом программе. как это можно сделать? Я спрашивал у своего препода-гражданина. Он говорит, мол, нужно вызывать исключение.
     
  4. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    А перегрузить new/delete не проще ?

    Код (Text):
    1. void* operator new(unsigned int sz)
    2. {
    3.     return GlobalAlloc(GPTR, sz);
    4. }
    5.  
    6. void operator delete(void* p)
    7. {
    8.     if (p)
    9.         GlobalFree(p);
    10. }
     
  5. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Хех.. и вправду проще. Я почему-то думал (где-то читал) что new перегружить нельзя. На моё удивление даже конструктор вызывается :)))
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Уточнения: глобальный оператор new, не рекомендуется.