Я очень запутался в управлении ресурсами в С++/CLI. Я думал, что на нем есть дескриптор (не каламбур), но я наткнулся на класс auto_gcroot<T>
, просматривая заголовочные файлы, что привело к поиску в Google, затем к лучшей части дневной документации и теперь путанице. Поэтому я решил, что обращусь к сообществу.
Мои вопросы касаются разницы между семантикой aut_handle/stack и auto_gcroot/gcroot.
-
auto_handle: Я понимаю, что это очистит управляемый объект, созданный в управляемой функции. Моя путаница заключается в том, что сборщик мусора не должен делать это для нас? Разве это не весь код управляемого кода? Чтобы быть более конкретным:
//Everything that follows is managed code void WillThisLeak(void) { String ^str = gcnew String ^(); //Did I just leak memory? Or will GC clean this up? what if an exception is thrown? } void NotGoingToLeak(void) { String ^str = gcnew String^(); delete str; //Guaranteed not to leak, but is this necessary? } void AlsoNotGoingToLeak(void) { auto_handle<String ^> str = gcnew String^(); //Also Guaranteed not to leak, but is this necessary? } void DidntEvenKnowICouldDoThisUntilToday(void) { String str(); //Also Guaranteed not to leak, but is this necessary? }
Теперь это имело бы смысл для меня, если бы это заменило ключевое слово С#, и оно было рекомендовано только для использования с такими ресурсоемкими типами, как Bitmap, но это не упоминается нигде в документах, поэтому я боялся утечки память все это время
-
auto_gcroot
Могу ли я передать его в качестве аргумента для собственной функции? Что произойдет с копией?
void function(void)
{
auto_gcroot<Bitmap ^> bmp = //load bitmap from somewhere
manipulateBmp(bmp);
pictureBox.Image = bmp; //Is my Bitmap now disposed of by auto_gcroot?
}
#pragma unmanaged
void maipulateBmp(auto_gcroot<Bitmap ^> bmp)
{
//Do stuff to bmp
//destructor for bmp is now called right? does this call dispose?
}
Будет ли это работать, если бы я использовал gcroot?
Кроме того, в чем преимущество использования auto_handle и auto_gcroot? Похоже, они делают подобные вещи.
Я, должно быть, неправильно понимаю, что для этого так мало смысла, поэтому хорошее объяснение было бы замечательным. Также будут приветствоваться любые указания относительно правильного использования этих типов, места, где я могу пойти, чтобы изучить этот материал, и любые более эффективные практики/места, которые я могу их найти.
Большое спасибо, Макс