Я очень запутался в управлении ресурсами в C ++ / CLI. Я думал, что у меня есть ручка (без каламбура), но я наткнулся на класс auto_gcroot
, просматривая файлы заголовков, что привело к поиску в Google, а затем к большей части дня чтения документация, а теперь неразбериха. Так что я решил обратиться к сообществу.
Мои вопросы касаются разницы между семантикой auto_handle / stack и auto_gcroot / gcroot.
auto_handle: Насколько я понимаю, это очистит управляемый объект, созданный в управляемой функции.Меня смущает то, что сборщик мусора не должен делать это за нас? Разве не в этом весь смысл управляемого кода? Чтобы быть более конкретным:
// Все, что следует далее, является управляемым кодом
void WillThisLeak (недействительно)
{
Строка ^ str = gcnew Строка ^ ();
// Я только что потерял память? Или GC уберет это? что, если возникнет исключение?
}
void NotGoingToLeak (недействительно)
{
Строка ^ str = gcnew Строка ^ ();
удалить str;
// Гарантированно не протекает, но нужно ли это?
}
void ТакжеNotGoingToLeak (недействительно)
{
auto_handle <Строка ^> str = gcnew String ^ ();
// Также гарантировано отсутствие утечек, но нужно ли это?
}
void DidntEvenKnowICouldDoThisUntilToday (недействительно)
{
Строка str ();
// Также гарантировано отсутствие утечек, но нужно ли это?
}
Теперь это имело бы смысл для меня, если бы это была замена ключевого слова using в C # и рекомендовалось только для использования с ресурсоемкими типами, такими как 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? Похоже, они делают похожие вещи.
Я, должно быть, неправильно понял что-то, чтобы это имело так мало смысла, поэтому хорошее объяснение было бы отличным. Также были бы очень признательны за любые рекомендации относительно правильного использования этих типов, места, куда я могу пойти, чтобы изучить этот материал, и любые другие полезные практики / места, которые я могу их найти.
большое спасибо, Макс