В статье 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне нужно в окне рисовать таблицу в qt Я делаю так: Создаю таблицу:
Есть String lastyear в которой лежит значение 2015; Нужно к ней добавить 10 лет, чтобы получить в итоге:
Я пишу приложение, мне на сервере нужно компилировать и запускать код который пришлёт пользовательКак мне запускать сторонний код так что...