@014

Как работает размещающий оператор new?

В книге Шлее Qt 5.3 есть пример программы где используется необычная запись оператора new на которой я "подвис". Пишут что это размещающий оператор, как я понял им можно создать и инициализировать заранее выделенную память. Но запись этого оператора у Шлее в задаче как то не вписывается в это.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //Widget w;
    //w.show();
    QTextEdit txt;
    QFont fnt("Lucida Console", 12, QFont::Normal);
    txt.document()->setDefaultFont(fnt);

    new SyntaxHighLigther(txt.document()); // Вот она!!!

    QPalette pal = txt.palette();
    pal.setColor(QPalette::Base, Qt::darkBlue);
    pal.setColor(QPalette::Text, Qt::yellow);
    txt.setPalette(pal);

    txt.show();
    txt.resize(640, 480);

    QFile file("syntaxhighlighter.cpp");
    file.open(QFile::ReadOnly);
    txt.setPlainText(file.readAll());

    return a.exec();


Не понятна вот эта запись: new SyntaxHighLigther(txt.document());
SyntaxHighLigther - это класс, объекта которого не создано, то есть тут происходит создание нового объекта и инициализация его, но КУДА происходит его запись? Ведь по левую сторону оператора new ничего не стоит.
  • Вопрос задан
  • 1467 просмотров
Решения вопроса 1
@MiiNiPaa
Это не размещающий new. Это обычное создание объекта. Коструктор хайлайтера регистрирует себя в родительском объекте и родительский объект ответственен за его удаление, поэтому результат new-expression не используется.

Placement new выглядит как:
new ( <pointer> ) ClassName(...)

Чтобы понять, как работает размещающее new, надо понять отличие new-expression от оператора new. new-expression делает вещи:
  1. Вызывает оператор new, передавая в него параметры написанные после new и до имени класса. Этот оператор выделяет память и возвращает указатель на выделенную память
  2. Вызывает конструктор класса, передав параметры написанные после имени класса. Это создаст объект в памяти выделенной в (1)


Размещающий оператор new берёт в качестве параметра указатель на уже выделенную память и просто возвращает его.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
но КУДА происходит его запись?

Это ошибка в книге. Такие бывают при косяках издательства.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы