Путаница управления ресурсами C ++ / CLI
Я очень запутался в управлении ресурсами в C ++ / CLI. Я думал, что у меня есть ручка (без каламбура), но я наткнулся черезauto_gcroot<T>
класс, просматривая заголовочные файлы, которые привели к поиску в Google, затем лучшая часть дня, читая документацию, и теперь путаница. Так что я решил обратиться к сообществу.
Мои вопросы касаются разницы между семантикой auto_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?
}
Теперь это имело бы смысл для меня, если бы это было заменой ключевого слова C # using, и это было рекомендовано только для использования с ресурсоемкими типами, такими как 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? Кажется, они делают подобные вещи.
Должно быть, я что-то неправильно понял, чтобы это так мало имело смысла, поэтому хорошее объяснение было бы здорово. Также будет очень благодарна за любые рекомендации относительно правильного использования этих типов, мест, куда я могу пойти, чтобы изучить этот материал, и любых других полезных практик / мест, которые я могу найти их.
большое спасибо Макс