Что такое gcnew?
Я наткнулся на этот код и слишком горжусь тем, чтобы пойти и спросить автора, что это означает.
Hashtable^ tempHash = gcnew Hashtable(iterators_); IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
Что такое gcnew и насколько важно использовать его вместо простого new ? (Я также наткнулся на каретку; я спросил об этом здесь.)
Поделиться Источник 14 октября 2008 в 19:17
3 ответа
gcnew предназначен для ссылочных объектов.NET; объекты, созданные с помощью gcnew, автоматически собираются мусором; важно использовать gcnew с типами CLR
Поделиться 14 октября 2008 в 19:18
gcnew — это оператор, как и оператор new , за исключением того, что вам не нужно удалять что-либо, созданное с его помощью; это garbage collected. Вы используете gcnew для создания управляемых типов.Net, а new для создания неуправляемых типов.
Поделиться 14 октября 2008 в 19:19
Карет ‘^’ действует одновременно с ‘*’ в C/C++ при объявлении типа;
// pointer to new std::string object -> memory is not garbage-collected std::string* strPtr = new std::string; // pointer to System::String object -> memory is garbage-collected System::String^ manStr = gcnew System::String;
Я использую термин ‘указатель’, когда описываю управляемый объект как управляемый объект, который можно сравнить с ‘nullptr’, как указатель в C/C++. Ссылку в C/C++ нельзя сравнивать с ‘nullptr’, так как она является адресом существующего объекта.
Управляемые объекты используют автоматическое подсчётное значение, которое означает, что они автоматически уничтожаются, когда у них есть нулевой уровень ссылок, хотя если два или более недостижимых объекта ссылаются друг на друга, у вас все еще будет утечка памяти. Будьте предупреждены, что автоматический подсчёт ссылок не является бесплатным, поэтому используйте его разумно.
Практическое руководство. Использование gcnew для создания типов значений, а также использование неявной упаковки-преобразования
При использовании gcnew в типе значения будет создан прямоугольный тип значения, который затем можно поместить в управляемую кучу мусора.
Пример
// vcmcppv2_explicit_boxing4.cpp // compile with: /clr public value class V < public: int m_i; V(int i) : m_i(i) <>>; public ref struct TC < void do_test(V^ v) < if (v != nullptr) ; else ; >>; int main() < V^ v = gcnew V(42); TC^ tc = gcnew TC; tc->do_test(v); >
См. также
Обратная связь
Были ли сведения на этой странице полезными?
ref new, gcnew (C++/CLI и C++/CX)
Агрегатное ключевое слово ref new выделяет экземпляр типа, который является мусором, собираемым, когда объект становится недоступным, и возвращает дескриптор (^) выделенному объекту.
Все среды выполнения
Память для экземпляра типа, выделяемая ref new, освобождается автоматически.
Операция ref new вызывает исключение OutOfMemoryException , если не удается выделить память.
Дополнительные сведения о выделении и освобождении памяти для собственных типов C++ см. в статье Операторы new и delete.
Среда выполнения Windows
Используйте ref new, чтобы выделить память для объектов среды выполнения Windows, время существования которых требуется администрировать автоматически. Объект автоматически освобождается, когда число ссылок становится равным нулю, что происходит после выхода последней копии ссылки за пределы области. Подробные сведения см. в статье Ref classes and structs (C++/CX) (Ссылочные классы и структуры (C++/CX)).
Требования
Параметр компилятора: /ZW
Среда CLR
Память для управляемого типа (типа ссылки или значений) выделяется с помощью gcnew и освобождается с помощью сборки мусора.
Требования
Параметр компилятора: /clr
Примеры
В следующем примере с помощью gcnew выделяется объект Message.
// mcppv2_gcnew_1.cpp // compile with: /clr ref struct Message < System::String^ sender; System::String^ receiver; System::String^ data; >; int main() < Message^ h_Message = gcnew Message; //. >
В следующем примере с помощью gcnew создается упакованный тип значения для использования в качестве ссылочного типа.
// example2.cpp : main project file. // compile with /clr using namespace System; value class Boxed < public: int i; >; int main() < Boxed^ y = gcnew Boxed; y->i = 32; Console::WriteLine(y->i); return 0; >
См. также
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.
Отправить и просмотреть отзыв по
Gcnew в c что это
Совсем недавно я начал изучать С++, когда попытался создать Windows-приложение в Visual Studio, большая часть кода не вызвала у меня вопросов, но все же я так и не понял для чего используется оператор ^, и чем отличается gcnew от new. Подскажите пожалуйста, как можно подробнее, если есть возможность.
Регистрация: 21.03.2009
Сообщений: 2,193
Если вы хотите изучать нормальный C++ (или более политкорректно — «чистый C++»), то вам этого знать не обязательно. Операторы ^ и gcnew — это местные аналоги * и new из обычного C++, имеющие место в managed C++, он же C++ CLI. Последний представляет собой дикое сочетание вкуса и цвета нормального C++ и C#. Настоятельно не рекомендую копаться в этом довольно плохо сделанном гибриде, и заниматься либо C++, либо C#.
Подозреваю, что в Visual Studio вы при создании проекта выбираете тип проекта Visual C++ -> CLR. Консольное приложение на обычном C++ это Visual C++ -> Win32 -> Консольное приложение Win32.
Пользователь
Регистрация: 05.09.2009
Сообщений: 17
Да, вы правы, я именно так и делал. До этого я программировал на С# и только недавно начал изучать С++.
Регистрация: 12.11.2014
Сообщений: 4
Скорее всего ^ выполнена в виде макроса, в котором прописано инстанциирование объекта шаблонного класса-обертки над указателем на ресурс, принимающего тип в качестве параметра, тогда такая штука скажем
String^ ptr = gcnew String(«abc»);
template // в качестве T будет String
class GC
T* value; // суть в том что наш ресурс расположен по этому указателю
GC()
// хитрая реализация, вызовы методов GC
>
GC( const GC& other )
// хитрая реализация
>
GC& operator = ( const GC& other )
// хитрая реализация
>
~GC( )
// хитрая реализация
>
GC* operator -> ()
< return this; >
>;
то есть в обертку над указателем на ресурс того типа (в данном случае String) который создаем.
| kovalexius |
| Посмотреть профиль |
| Найти ещё сообщения от kovalexius |