Как переопределить new / delete ?

Тема в разделе "LANGS.C", создана пользователем Esson, 3 окт 2008.

  1. Esson

    Esson New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    7
    Хочу внести корективы в эти операторы
    Как их можно переопределить?
     
  2. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Код (Text):
    1. void* operator new (size_t s) { return NULL; }
    2. void* operator new [] (size_t s) { return NULL; }
    3. void operator delete (void* p) { return; }
    4. void operator delete [] (void* p) { return; }
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    +

    Код (Text):
    1. void operator delete( void *, size_t );
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну, тогда уж и про

    Код (Text):
    1. void* operator new(size_t, void*);  //placement new
    2. void operator delete(void*, void*); //placement delete
    3.  
    4. void* operator new(size_t, int line, const char* file);  //debug new
    5. void operator delete(void*, int line, const char* file); //debug delete
    не забываем. И вообще, параметров сколько угодно можно напихать после стандартных.
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    А ещё можно только для класса переопределить, чтобы все объекты класса создались с одного аллокатора:
    Код (Text):
    1. void* MyClass::operator new (size_t nBytes)
    2. {
    3.     return HeapAlloc (<heap handle>, <heap flags>, nBytes);
    4. }
    Даёт весьма быстрый код когда надо освободить сразу все созданные объекты. Освобождаем аллокатор - и с концами! Заодно можно почистить выделяемый блок, чтоб не надо было в конструкторе нулями всё забивать. Одна проблема: некоторые тулзы (DevPartner) будут детектировать такой код как утечку памяти.
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    А как потом использовать такой оператор напичканный нестандартными аргументами?

    к примеру:

    Код (Text):
    1. void* operator new (void* cp, unsigned sz)
    2. {
    3.   ...
    4. }
     
  7. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Для этого примера:

    Код (Text):
    1. void* pWhere = ...; //каким-то способом выделяем память
    2. BYTE* p = new (pWhere)  BYTE[1024];  //вот так передаем дополнительные аргументы
    Идея ясна?
     
  8. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Ага, просвещаемся, потихоньку :)

    Неправильно перегрузку оператора я написал :)

    Вот так вроде верно будет:
    Код (Text):
    1. void* operator new (unsigned sz, void* cp) // первый аргумент должен быть size_t (unsigned int)
    2. {
    3.    ...
    4. }
    И:
    new (arg2, arg3, arg...) type[arg1];