Как избавиться от СЕТЕВОГО взаимодействующего с COM объекта на Выпуске ()

Нахождение медианы в среднем случае O (n). Эквивалентный нахождению k-th самого большого объекта в списке n вещей, с k=n/2:

интервал kthLargest (список, k, во-первых, в последний раз) {j = раздел (список, во-первых, в последний раз), если (k == j) еще возвращают список [j] если (k

Здесь, partition выборы элемент центра, и в одной передаче через данные, перестраивает список так, чтобы объекты меньше, чем центр были на первом месте, тогда центр, затем объекты, больше, чем центр. "kthLargest" алгоритм очень похож на quicksort, но рекурсивно вызывает только одну сторону списка.

Для меня, это - самый простой рекурсивный алгоритм, который работает быстрее, чем итеративный алгоритм. Это использует 2*n сравнения в среднем, независимо от k. Это намного лучше, чем наивный подход выполнения k проходит через данные, находя минимум каждым разом, и отбрасывая его.

Alejo

10
задан mhenry1384 12 November 2009 в 19:42
поделиться

1 ответ

Фактически ни Dispose (или я должен сказать ~ Foo), ни Release не будут вызываться из COM-клиента при освобождении последней ссылки. Это просто не реализовано. Вот некоторые идеи, как это можно сделать.

http://blogs.msdn.com/oldnewthing/archive/2007/04/24/2252261.aspx#2269675

Но метод не рекомендуется даже автором.

Если вы также реализуете COM-клиент, лучшим вариантом будет запрос IDisposable и явный вызов Dispose, iid для запроса:

{805D7A98-D4AF-3F0F-967F-E5CF45312D2C}

Другой вариант, который я могу придумать, - это реализовать своего рода "сборщик мусора COM" ". Каждый объект, созданный COM, будет помещен в список (при условии, что объекты вашего типа могут быть созданы только COM - я не могу придумать никакого метода, чтобы отличить от места создания объекта). И тогда вам придется периодически проверять список и для каждого объекта вызывать что-то вроде этого:

IntPtr iUnk = Marshal.GetIUnknownForObject(@object);
int refCount = Marshal.Release(iUnk);
if (refCount == 0)
    @object.Dispose();

, но это какая-то безумная идея.

3
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: