Использование new в перегруженном new

179
13 сентября 2018, 00:30

В статье http://www.amse.ru/courses/cpp2/2011_03_21.html автор пишет:

Рекомендуется не производить в операторе new (особенно в глобальном) какие-либо операции с объектами, которые могут вызвать оператор new. Например, для вывода текста использовать функцию printf, а не объект std::cout.

С чем связана эта рекомендация? К каким неприятностям может привести ее нарушение?

Answer 1

Ну, смотрите: вот такой код

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.

Answer 2
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;
}
READ ALSO
В edit нужно рисовать таблицу

В edit нужно рисовать таблицу

Мне нужно в окне рисовать таблицу в qt Я делаю так: Создаю таблицу:

198
Добавить несколько лет к дате в строке

Добавить несколько лет к дате в строке

Есть String lastyear в которой лежит значение 2015; Нужно к ней добавить 10 лет, чтобы получить в итоге:

183
Не получается парсить JSON

Не получается парсить JSON

Есть Веб Сервис написанный на Jax-rs 20

187
Безопасный запуск программ на сервере

Безопасный запуск программ на сервере

Я пишу приложение, мне на сервере нужно компилировать и запускать код который пришлёт пользовательКак мне запускать сторонний код так что...

197