определение оператров new и delete
От: BOPOH_N Россия  
Дата: 05.02.04 18:29
Оценка:
Определяю свои глобальные операторы:

void * __cdecl operator new(size_t size, int type,  const char * file, int line, clock_t start)
{    
    return ::operator new( size+sizeof(start), type, file, line));    
}

void __cdecl operator delete(void * p, int type,const char * file,int line,clock_t stop )
{
    ::operator delete(p, type, file, line);     
}

main()
{
    Class *A = new (_NORMAL_BLOCK, __FILE__, __LINE__, clock());
    // все нормально объект память выделяется конструктор выполняется
    
    // а тут проблема, если так
    delete(A); // не вызывается мой оператор delete
    // если так
    operator delete(A, _NORMAL_BLOCK, __FILE__, __LINE__, clock());
    //то не вызывается деструктор
}


Как правильно вызвать мой оператор delete?
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re: определение оператров new и delete
От: a-lex Россия  
Дата: 05.02.04 21:25
Оценка: 2 (1)
Правилен последний вариант, только перед этим надо уничтожить объект:

        A->~Class();
BOP>    operator delete(A, _NORMAL_BLOCK, __FILE__, __LINE__, clock());

При использовании placement allocation/deallocation functions приходится вызывать деструкторы вручную.
Re: определение оператров new и delete
От: Lorenzo_LAMAS  
Дата: 06.02.04 07:25
Оценка:
Твой хитрый оператор delete будет вызван (неявно) только в случае возникновения исключения в конструкторе объекта, а сам ты, действительно, вынужден писать operator delete(expr-list).
Of course, the code must be complete enough to compile and link.
Re[2]: определение оператров new и delete
От: Lorenzo_LAMAS  
Дата: 06.02.04 07:26
Оценка:
Да, ну и естественно, что деструктор тут автоматически не вызовется
Of course, the code must be complete enough to compile and link.
Re[2]: определение оператров new и delete
От: BOPOH_N Россия  
Дата: 06.02.04 09:06
Оценка:
Здравствуйте, a-lex, Вы писали:

AL>Правилен последний вариант, только перед этим надо уничтожить объект:


AL>
AL>        A->~Class();
BOP>>    operator delete(A, _NORMAL_BLOCK, __FILE__, __LINE__, clock());

AL>При использовании placement allocation/deallocation functions приходится вызывать деструкторы вручную.

Обидно, досадно — ну ладно...
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.