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 |
Регистрация: 13.07.2012
Сообщений: 6,485
Сообщение от kovalexius
Скорее всего ^ выполнена в виде макроса
Осталось:
а) Не писать по ночам дабы не писать в темы 4-5 летней давности
б) Научить компилятор понимать выражение #define ^ ибо он этого не умеет.
Практическое руководство. Использование 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; >
Что значит «тип ^ переменная;»? (CLR)
Это указатели на «управляемую память». То есть память, которая управляется .NET и выделяется через gcnew .
Называют они это Handle to Object Operator (^) — прям на сайта MSDN
- https://docs.microsoft.com/ru-ru/cpp/extensions/ref-new-gcnew-cpp-component-extensions?view=msvc-160
- https://www.bestprog.net/ru/2017/05/07/%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8-%D1%87%D0%B0%D1%81%D1%82%D1%8C-6-%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BD%D1%8B%D0%B5-native-%D0%B8-managed-%D1%82%D0%B8%D0%BF%D1%8B-%D0%B4/
Отслеживать
ответ дан 16 дек 2020 в 9:05
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
