C ++ / CLI: родная ссылка против ссылки отслеживания - PullRequest
2 голосов
/ 16 декабря 2009

В чем разница между следующими двумя функциями?

ref class SomeClass;

void swap(SomeClass^& a, SomeClass^& b){
    SomeClass^ c = a;
    a = b;
    b = c;
}

void swap2(SomeClass^% a, SomeClass^% b){
    SomeClass^ c = a;
    a = b;
    b = c;
}

Ответы [ 2 ]

1 голос
/ 16 декабря 2009

Основное различие между ссылкой и ссылкой отслеживания состоит в том, что ссылка отслеживания может перемещаться сборщиком мусора.

Во время запуска ГК объекты перемещаются. Если вы обращаетесь к объекту после его перемещения по адресу, вы читаете garbadge. Вот где появляется дескриптор отслеживания. Он знает о перемещении gc и его объекта. Вы все еще можете получить доступ к объекту после того, как он был перемещен.

С MSDN :

Ссылка на отслеживание похожа на C ++ ссылка, чтобы указать, что переменная передается в функцию ссылка и создать альтернативу имя для объекта. Тем не менее объект, на который ссылается отслеживание ссылка может быть перемещена во время исполнение общим языком сборщик мусора во время выполнения.

Я не знаю, если взятие ссылки (&) на gc-объект останавливает его перемещение gc.

0 голосов
/ 17 декабря 2009

Я предполагаю, что 2-й случай нельзя использовать извне C ++ / CLI (например, VB, C # и т. Д.), Тогда как первый может. Хотя я не пробовал.

...