Visual C ++ без изменений и управляем - PullRequest
6 голосов
/ 06 апреля 2011

В чем различия между созданием экземпляра объекта .NET в C ++, который является управляемым и неуправляемым.То есть, чем отличаются эти операторы to:

StreamWriter ^stream = gcnew StreamWriter(fileName);

против

StreamWriter *stream = new StreamWriter(fileName);

Я предполагаю, что если я использую gcnew, память, выделенная для StreamWriter, будет управлятьсяу сборщика мусора.В качестве альтернативы, если я использую указатель (*) и новое ключевое слово, мне придется вызвать delete, чтобы освободить память.

Мой реальный вопрос: будет ли сборщик мусора управлять памятью, которая выделяется внутри объектов .NET?Например, если объект .NET создает экземпляр другого объекта и выходит из области видимости, будет ли сборщик мусора управлять этой памятью, даже если я использую указатель (*) и ключевое слово new, а НЕ gcnew и handle (^).

Ответы [ 2 ]

6 голосов
/ 06 апреля 2011

В C ++ / CLI вы не можете new объект .NET, вы получите нечто похожее на следующую ошибку:

ошибка C2750: 'System :: Object':не может использовать «новый» для ссылочного типа;вместо этого используйте «gcnew»

Использование new для объектов .NET разрешено в более старых Managed Extensions для C ++ (/clr:oldsyntax флаг компилятора).«Управляемый C ++» теперь устарел, потому что это ужасно.Он был заменен C ++ / CLI, который представил ^ и gcnew.

В C ++ / CLI вы должны использовать gcnew^ дескрипторы) для управляемых типов, и вы должныиспользуйте new* указатели) для нативных типов.Если вы создаете объекты в собственной куче, используя new, вы обязаны уничтожить их, когда закончите с ними.

В идеале вы должны использовать умный указатель (например, std::shared_ptr или std::unique_ptr) для управления объектом в собственной куче.Однако, поскольку вы не можете иметь собственный интеллектуальный указатель в качестве поля класса ref, это не совсем просто.Самый простой и общий подход, вероятно, состоит в том, чтобы написать свой собственный класс ref-оболочки для указателей, который правильно реализует IDisposable.

4 голосов
/ 06 апреля 2011

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

Если вы используете new , он не будет привязан к сборщику мусора, и вы будете обязаны удалить объект.

Просто чтобы уточнить:
Если у вас есть управляемый объект C #, содержащий внутри себя неуправляемый объект, сборщик мусора не удалит неуправляемый объект. Он просто вызовет деструктор управляемого объекта (если он существует) перед удалением. Вы должны написать свой собственный код в деструкторе, чтобы удалить созданные вами неуправляемые объекты.

...