global new & delete
От: Brutalix  
Дата: 13.10.09 00:22
Оценка:
Други, а помогите решить маленькую проблемку:

Имеется программа на С++, в ней есть такая вещь:

void *operator new ( size_t nb ) throw ( std::bad_alloc )
{
return Некий_экзотический_способ_выделения_памяти;
}

и все бы хорошо, но иногда хотелось бы в программе использовать стандартный new.

Это вообще возможно? Если да, то как это сделать?
Re: global new & delete
От: Murom Россия  
Дата: 13.10.09 02:41
Оценка: +1 :)
Здравствуйте, Brutalix, Вы писали:

B>Имеется программа на С++, в ней есть такая вещь:


B>void *operator new ( size_t nb ) throw ( std::bad_alloc )

B>{
B> return Некий_экзотический_способ_выделения_памяти;
B>}

B>и все бы хорошо, но иногда хотелось бы в программе использовать стандартный new.


B>Это вообще возможно? Если да, то как это сделать?


Вообще безоговорочная подмена стандартных конструкций в "обычном" коде это не совсем хорошо (мы сейчас не говорим про всякие детекторы утечек памяти и иже с ними).
Если хочется иметь и экзотический и обычный new, то экзотический переименовывается в exotic_new и при чтении программы вы наглядно увидите, где какой аллокатор используется.
- Eugeny
Re: global new & delete
От: Евгений.К  
Дата: 13.10.09 02:49
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Други, а помогите решить маленькую проблемку:


B>Имеется программа на С++, в ней есть такая вещь:


B>void *operator new ( size_t nb ) throw ( std::bad_alloc )

B>{
B> return Некий_экзотический_способ_выделения_памяти;
B>}

B>и все бы хорошо, но иногда хотелось бы в программе использовать стандартный new.


B>Это вообще возможно? Если да, то как это сделать?


Если есть необходимость использовать определенный по умолчанию оператор new и экзотический способ выделения, то экзотический способ я бы тоже назвал экзотически, а operator new оставил бы как есть.
Re[2]: global new & delete
От: Brutalix  
Дата: 13.10.09 03:17
Оценка:
Здравствуйте, Murom, Вы писали:

M>Вообще безоговорочная подмена стандартных конструкций в "обычном" коде это не совсем хорошо (мы сейчас не говорим про всякие детекторы утечек памяти и иже с ними).


Я абслютно и полностью с этим согласан. Причем, "не совсем хорошо" это еще очень мягко сказано.

M>Если хочется иметь и экзотический и обычный new, то экзотический переименовывается в exotic_new и при чтении программы вы наглядно увидите, где какой аллокатор используется.


Ситуация такая — экзотический new написан большим начальником, который горд тем что он знает С++ и может написать экзотический new.

Что я пытаюсь сделать — это заставить все это дело работать, хоть как-нибудь. Так, что, к сожалению, решение "снести экзотический new" в данный момент использовать не могу.
Re[2]: global new & delete
От: Brutalix  
Дата: 13.10.09 03:19
Оценка:
Здравствуйте, Евгений.К, Вы писали:

ЕК>Если есть необходимость использовать определенный по умолчанию оператор new и экзотический способ выделения, то экзотический способ я бы тоже назвал экзотически, а operator new оставил бы как есть.


Это самое разумное решение (я Мурому уже написал, он аналогичный совет давал). Проблема в том, что мы простых путей не ищем, мы создаем себе проблемы и их успешно преодолеваем.
Re: global new & delete
От: Bell Россия  
Дата: 13.10.09 04:52
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Други, а помогите решить маленькую проблемку:


B>Имеется программа на С++, в ней есть такая вещь:


B>void *operator new ( size_t nb ) throw ( std::bad_alloc )

B>{
B> return Некий_экзотический_способ_выделения_памяти;
B>}

B>и все бы хорошо, но иногда хотелось бы в программе использовать стандартный new.

B>Это вообще возможно? Если да, то как это сделать?

Боюсь, что тебе не повезло:

17.4.3.4/2
A C + + program may provide the definition for any of eight dynamic memory allocation function signatures
declared in header <new> (3.7.3, clause 18):
— operator new(size_t)
— operator new(size_t, const std::nothrow_t&)
...

17.4.3.4/3
The program’s definitions are used instead of the default versions supplied by the implementation (18.4).
Such replacement occurs prior to program startup (3.2, 3.6).


Можно попытаться обойти пользовательскую реализацию, использовав вариант с nothrow и ручным удалением:
class test
{
   int i_;
public:
   test(int i) : i_(i) {};
};


int main()
{
   test* pt = new (ptr) test(10);

   //...

   pt->~test();
   ::operator delete(pt, std::nothrow_t());
   return 0;
}


nothrow — варианты operator new и operator delete придется реализовать самому, например через malloc/free.
Любите книгу — источник знаний (с) М.Горький
Re[3]: global new & delete
От: Pavel Dvorkin Россия  
Дата: 13.10.09 04:57
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Ситуация такая — экзотический new написан большим начальником, который горд тем что он знает С++ и может написать экзотический new.


B>Что я пытаюсь сделать — это заставить все это дело работать, хоть как-нибудь. Так, что, к сожалению, решение "снести экзотический new" в данный момент использовать не могу.


Если стандартный new надо использовать не для классов, то можно просто заменить его на malloc. Решение не бог весть какое, но коль основная задача объехать по кривой код начальника...
With best regards
Pavel Dvorkin
Re[3]: global new & delete
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 13.10.09 05:29
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Ситуация такая — экзотический new написан большим начальником, который горд тем что он знает С++ и может написать экзотический new.


B>Что я пытаюсь сделать — это заставить все это дело работать, хоть как-нибудь. Так, что, к сожалению, решение "снести экзотический new" в данный момент использовать не могу.


можно переопределить операторы new/delete для своих классов, реализовать их с помощью malloc/free
можно использовать аллокаторы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.