семантика стека и сомнения
От: jyuyjiyuijyu  
Дата: 08.12.13 09:21
Оценка:
корректен ли данный код ?

ref struct data1_t
{
    String^ field1;
    String^ field2;
    int field3;
};

List<data1_t^>^ test()
{
    auto list = gcnew List<data1_t^>;

    for (int i = 0; i < 5; i++)
    {
        data1_t d;

        d.field1 = "key" + i.ToString();
        d.field2 = "value" + i.ToString();
        d.field3 = 0xbaddcafe + i;

        list->Add(%d);
    }

    return list;
}

int main(array<System::String ^> ^args)
{
    for each (data1_t^ d in test())
    {
        Console::WriteLine("{0} {1} {2:x}", d->field1, d->field2, d->field3);
    }

    return 0;
}



вот мои размышления

во первых ref class/struct всегда распологаются в managed куче поэтому даже в этом
случае при использовании stack semantic для data1_t объект создается в куче и можно смело
взять его адрес и засунуть в список ссылок...

но при использовании семантики стека всегда вызывается dispose если он определен и
разрушает объект и может оказаться так что ссылка будет указывать на уже разрушенный объект
хотя память из под объекта удалена не будет пока существует ссылка в списке хендлов

тоесть к чему я веду правильно ли я понимаю что вообще такое использование некорректно так как
мы достоверно не знаем определен ли метод dispose в некоем типе но в данном случае так как dispose
не определен то код вполне корректный ?

спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.