Gcnew в c что это

от admin

Name already in use

cpp-docs / docs / extensions / ref-new-gcnew-cpp-component-extensions.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

ref new, gcnew (C++/CLI and C++/CX)

The ref new aggregate keyword allocates an instance of a type that is garbage collected when the object becomes inaccessible, and that returns a handle (^) to the allocated object.

Memory for an instance of a type that is allocated by ref new is deallocated automatically.

A ref new operation throws OutOfMemoryException if it is unable to allocate memory.

For more information about how memory for native C++ types is allocated and deallocated, see the new and delete operators.

Use ref new to allocate memory for Windows Runtime objects whose lifetime you want to administer automatically. The object is automatically deallocated when its reference count goes to zero, which occurs after the last copy of the reference has gone out of scope. For more information, see Ref classes and structs.

Compiler option: /ZW

Common Language Runtime

Memory for a managed type (reference or value type) is allocated by gcnew, and deallocated by using garbage collection.

Compiler option: /clr

The following example uses gcnew to allocate a Message object.

The following example uses gcnew to create a boxed value type for use like a reference type.

What is gcnew?

C. K. Young's user avatar

gcnew is an operator, just like the new operator, except you don’t need to delete anything created with it; it’s garbage collected. You use gcnew for creating .Net managed types, and new for creating unmanaged types.

The caret ‘^’ acts simarly to the ‘*’ in C/C++ when declaring a type;

I use the term ‘pointer’ when describing the managed object as a managed object can be compared to ‘nullptr’ just like a pointer in C/C++. A reference in C/C++ can not be compared to ‘nullptr’ as it is the address of an existing object.

Managed objects use automatic-reference-counting meaning that they are destroyed automatically when they have a reference count of zero although if two or more unreachable objects refer to eachother, you will still have a memory leak. Be warned that automatic reference counting is not free performance wise so use it wisely.

Что такое gcnew?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int :

В этом примере переменная x является int , и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Первая строка объявляет переменную с именем num , но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception , о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num . Перед созданием объекта вы получите NullPointerException . В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

В этом случае вы не создаете объект obj , скорее предполагая, что он был создан до вызова метода doSomething . К сожалению, этот метод можно вызвать следующим образом:

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException , потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

Что такое gcnew?

Из любопытства, насколько важно использовать gcnew с типами CLR? Можно ли статически объявить тип CLR (т. Е. Использовать System::String вместо System::String^ )? Будет ли он правильно освобожден в конце своего жизненного цикла / области действия? — jliv902

@ jliv902: Я в этом сомневаюсь — но какое-то время я был вне этой сферы! — Стивен А. Лоу

gcnew является оператором, как и new оператор, за исключением того, что вам не нужно delete все, что создано с его помощью; это gмусор cсобрано. Ты используешь gcnew для создания управляемых типов .Net и new для создания неуправляемых типов.

ответ дан 01 окт ’20, 19:10

проголосовали за (не то чтобы вам нужны очки), потому что мы опубликовали один и тот же ответ одновременно — Стивен А. Лоу

Каретка ‘^’ действует аналогично ‘*’ в C / C ++ при объявлении типа;

Я использую термин «указатель» при описании управляемого объекта, поскольку управляемый объект можно сравнить с «nullptr», как указатель в C / C ++. Ссылку в C / C ++ нельзя сравнивать с nullptr, поскольку это адрес существующего объекта.

Управляемые объекты используют автоматический подсчет ссылок, что означает, что они автоматически уничтожаются, когда их счетчик ссылок равен нулю, хотя, если два или более недостижимых объекта ссылаются друг на друга, у вас все равно будет утечка памяти. Имейте в виду, что автоматический подсчет ссылок не является бесплатным с точки зрения производительности, поэтому используйте его с умом.

Читать:
Как сделать воду в юнити

Related Posts