В статье http://www.amse.ru/courses/cpp2/2011_03_21.html автор пишет:
Рекомендуется не производить в операторе new (особенно в глобальном)
какие-либо операции с объектами, которые могут вызвать оператор new.
Например, для вывода текста использовать функцию printf, а не объект
std::cout.
С чем связана эта рекомендация? К каким неприятностям может привести ее нарушение?
Ну, смотрите: вот такой код
class Test
{
public:
Test(int i):i(i){}
void out() const { cout << "Test(" << i << ")\n"; }
void * operator new(size_t sz);
void operator delete(void * p);
private:
int i;
};
void * Test::operator new(size_t sz)
{
//return new Test(0);
return malloc(sz);
}
void Test::operator delete(void * p)
{
free(p);
}
проблем не вызовет. Но стоит в операторе new раскомментировать одну строку и закомментировать вторую - как даже компилятор взбесится :) Просто он тут все видит, а вот если вызвать какую-то функцию опосредованно, из другого файла, которая вызовет new Test - то компилятор предупредить не сможет, и проблемы возникнут без предупреждения.
Особенно в случае глобального new.
void* operator new(size_t n) {
std::cout.put('a');
return malloc(n);
}
Здесь обьект std::cout меняет свое состояние, а если в программе этот обьект вызовит оператор, то это состояние будет "активизировано "
int main()
{
std::cout << *(new char('b')) ;
// ожидается вывод только символа 'b', но увы, выведится `ab`
return 0;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей