Оператор Placement New
 
Оператор строит объект по указанному адресу памяти.

Синтаксис

result = New(address) datatype
или
result = New(address) datatype ( initializers, ... )
или
result = New(address) datatype[ count ]

Параметры

address
Расположение в памяти, чтобы построить. Скобки не являются обязательными.
initializers
Начальное значение(я) для переменной.
datatype
имя типа данных, для построения.
count
Количество элементов, для построения.

Возвращаемое значение

A pointer of type datatype to the newly constructed data.

Description

Оператор Placement New строит указанный тип данных в указанном месте памяти.

Оператор Placement New не может быть непосредственно использован с String, но работает с Udt , содержащим строку.

Для простых типов, как целые числа, начальное значение может быть предоставлено. Для типов без ConstructorS(конструкторов), начальные значения могут быть определены для каждого поля. Типы, которые имеют конструкторы могут иметь свои конструкторы, вызываемые также Placement New. Если инициализаторы не даны, значения по умолчанию для этих типов будет установлено.

Память не выделяется при использовании оператора Placement New. Вместо этого, используется память по указанному  address.
Неправильно вызывать Delete для адреса (в противном случае, память освобождается). Правильным способом является только вызов деструктора (с синтаксисом, как и для метода элемента, с помощью оператора доступа к элементу).
См. пример ниже для надлежащего использования placement new.

Указание начального значения Any, как в New(address)datatype(Any) или New(address)datatype[count]{Any} не будет инициализировать данные. Это действует только на типы данных, которые не имеют конструкторы.

Пример

'' "placement new" пример

Type Rational
    As Integer    numerator, denominator
    Declare Destructor ( )
End Type

Destructor Rational ( )
End Destructor

Scope
    
    '' выделить некоторую память для построения Rational
    Dim As Any Ptr ap = CAllocate(Len(Rational))
    
    '' Сделать вызов placement new
    Dim As Rational Ptr r = New (ap) Rational( 3, 4 )
    
    '' Вы можете видеть, адреса совпадают, просто имеют различные типы в компиляторе
    Print ap, r
    
    '' подтвердить, что все в порядке
    Print r->numerator & "/" & r->denominator

    '' уничтожение должно быть сделано явно, потому что delete будет автоматически освобождать память,
    '' а это не всегда нужно при использовании placement new. ВСЕГДА в таких случаях надо явно вызывать деструктор.
    r->Destructor( )
    
    '' мы явно выделяем память, поэтому мы явно ее освобождаем с помощью deallocate
    Deallocate( ap )

End Scope

Различия диалектов

  • Доступно только в диалекте -lang fb.

Отличия от QB

  • Новое в FreeBASIC

См. также