Re[4]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 19.10.08 07:15
Оценка:
V>>Было бы чего показывать:
_FR>[c#]
V>StreamWriter sw = new StreamWriter(file, enc1251); // Why stack overflow?
[/c#]


_FR>Call Stack в точке возникновения "stack overflow" давай посмотрим.


Сейчас stack overflow возникает в недрах mscorlib.dll с вероятностью 25-30% при создании экземпляра объекта. Это при том, что все методы закомментированы.
Re[4]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 19.10.08 07:51
Оценка:
Только у меня dll и framework 2.0. В новом проекте работает. Но уже понятно, что проблема не в этом коде, а в окружении объекта. В глючном проекте даже "чистый" объект без методов дает stack overflow.
Постараюсь сегодня локализовать проблему путем последователеьной реконструкции глючного проекта в отдельном проекте.
Re[5]: В каком случае деструктор вызывается несколько раз?
От: TK Лес кывт.рф
Дата: 19.10.08 09:14
Оценка: +1 -1
Здравствуйте, visus, Вы писали:

TK>>Автор случайно не Григорий Остер?

V>Минус решил не ставить. RTFM.

Старайтесь просто меньше концентрироваться на чтении FM и больше на понимании. тема "деструкторы в C#" поднималась тут уже не раз — в классическом понимании деструкторов в c# нет и если вы не хотите создать "недопонимание" то, использовать это сло надо очень осторожно.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[8]: В каком случае деструктор вызывается несколько раз?
От: drol  
Дата: 19.10.08 10:01
Оценка:
Здравствуйте, adontz, Вы писали:

A>Следующее как раз финалайзер и есть.


Finalizer — терминология CLI. Спецификация же C#, как можно видеть, использует термин деструктор. И слово finalizer в ней можно найти только в названиях методов.

A>Забавно, и это у меня каша.


Конечно. Ведь чтобы каши не было, нужно, как минимум, читать спецификации.

A>Метод нужен, почитай про IDisposable. Просто в отличие от Си++, его приходится выхывать вручную.


А типа на C++ аналог IDisposable с "ручным" вызовом сделать невозможно. "Гы" много раз...

Повторяю ещё раз: деструкторы (или finalizer'ы, если Вам больше нравится терминология CLI) вызываются runtime'ом вне нормального контекста исполнения. Тогда как IDisposable.Dispose() вызывается совершенно обычным способом, и в нормальном контексте исполнения.
Re[9]: В каком случае деструктор вызывается несколько раз?
От: Pavel M. Россия  
Дата: 19.10.08 18:10
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, adontz, Вы писали:


A>>Следующее как раз финалайзер и есть.


D>Finalizer — терминология CLI. Спецификация же C#, как можно видеть, использует термин деструктор. И слово finalizer в ней можно найти только в названиях методов.


A>>Забавно, и это у меня каша.


D>Конечно. Ведь чтобы каши не было, нужно, как минимум, читать спецификации.


A>>Метод нужен, почитай про IDisposable. Просто в отличие от Си++, его приходится выхывать вручную.


D>А типа на C++ аналог IDisposable с "ручным" вызовом сделать невозможно. "Гы" много раз...


D>Повторяю ещё раз: деструкторы (или finalizer'ы, если Вам больше нравится терминология CLI) вызываются runtime'ом вне нормального контекста исполнения. Тогда как IDisposable.Dispose() вызывается совершенно обычным способом, и в нормальном контексте исполнения.


А кто-то в этом сомневался? IDisposable раскрывается в try-finally блок.
--------------------------
less think — do more
Re[9]: В каком случае деструктор вызывается несколько раз?
От: Pavel M. Россия  
Дата: 19.10.08 18:12
Оценка:
Здравствуйте, visus, Вы писали:

>>> всё должно работать.


PM>>Работает?


V>Работает. Вас это беспокоит? Вы хотите об это поговорить? Я в общем-то не против.


Поговорите тут сами с собой. Может быть от этого лучше заработает. Вы ошиблись форумом.
--------------------------
less think — do more
Re[9]: В каком случае деструктор вызывается несколько раз?
От: Pavel M. Россия  
Дата: 19.10.08 22:09
Оценка:
Здравствуйте, visus, Вы писали:

V>Прочитайте пожалуйста ветку с начала. Я не искал ничего про using, вы сами себя ввели в заблуждение. И то, что вы не знали про существование "Destructors" в понимании C#, говорит о том, что вы не совсем владеете темой вопроса.


Developer Guide — хорошая вещь, но книги признанные тоже являются официальными документами, которые ревьюируются не раз перед выходом.


Does the Object Need a Finalizer?

A finalizer is a method that you can implement on your class and that is called prior to the GC
cleaning up your unused object from the heap. Let’s get one important concept clear up front:
Finalizers are not destructors, nor should you view them as destructors.
Destructors are associated with deterministic destruction of objects. Finalizers are associated
with nondeterministic destruction of objects. Unfortunately, much of the confusion between finalizers
and destructors comes from the fact that the C# language designers chose to map finalizers
into the C# destructor syntax, which is identical to the C++ destructor syntax. In fact, you’ll find that
it’s impossible to overload Object.Finalize explicitly in C#. You overload it implicitly by using the
destructor syntax that you’re used to if you come from the C++ world. The only good thing that
comes from C# implementing finalizers this way is that you never have to worry about calling the
base class finalizer. The compiler does that for you.

© Trey Nash "Accelerated C# 2008" Foreword by Wes Dyer C# Language Design Team, Microsoft

--------------------------
less think — do more
Re[5]: В каком случае деструктор вызывается несколько раз?
От: _d_m_  
Дата: 20.10.08 00:28
Оценка: 63 (2) +1
Здравствуйте, visus, Вы писали:

TK>>Автор случайно не Григорий Остер?


V>Минус решил не ставить. RTFM.


А мне вот что-то очень хочется тебе минус поставить.

Ecma-334 (C# Language Specification):

17.12 Finalizers
[Note: In the previous version of this standard, what is now referred to as a "finalizer" was called a
"destructor". Experience has shown that the term "destructor" caused confusion and often resulted to
incorrect expectations, especially to programmers knowing C++. In C++, a destructor is called in a
determinate manner, whereas, in C#, a finalizer is not. To get determinate behavior from C#, one should use
Dispose. end note]

Re[3]: В каком случае деструктор вызывается несколько раз?
От: Pavel Dvorkin Россия  
Дата: 20.10.08 03:54
Оценка:
Здравствуйте, visus, Вы писали:

A>>О чём речь вообще?


V>Вот об этом: Destructors (C# Programming Guide)


И вот тут уважаемый ИТ тоже это слово произносит

http://www.rsdn.ru/article/dotnet/GCnet.xml
Автор(ы): Игорь Ткачев
Дата: 06.12.2002
Алгоритм работы сборщика мусора (garbage collector, далее просто GC), являющегося частью CLR, подробно описан в книге Джефри Рихтера (Jeffrey Richter) «Applied Microsoft .NET Framework Programming». Мы не будем приводить здесь столь же подробное описание этого алгоритма, но обязательно остановимся на некоторых ключевых моментах.
.

Субудай показал пальцем на лохматую собачонку, которая жалась к ногам
охотника и огрызалась на монголов;
— Как по-урусутски зовется эта зверушка?
Охотник ответил:
— А пес! Пустобрех!
Субудай спросил другого:
— Как зовут зверушку?
— Жучка! Тютька!
Субудай спросил третьего охотника. Тот сказал:
— Лайка! Охотницкая собачонка.
Субудай покачал головой:
— Трудный язык урусутов. По-монгольски все просто и ясно — одно слово
"нохой", и все знают, что это собака. А урусуты — путаники. Каждый назы-
вает по-своему. Вот они и не понимают друг друга.

(С) В,Ян "Батый"
With best regards
Pavel Dvorkin
Re[4]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 20.10.08 14:57
Оценка:
Re[4]: В каком случае деструктор вызывается несколько раз?
От: visus
Дата: 20.10.08 22:48

Так, похоже кидаться ссылками без каких-либо причин и обьяснений в этом форуме считается нормой.
Что такое деструктор, finalize, using, dispose, сборщик мусора я знаю. Мне твоя ссылка настолько же полезна как тебе вот эта: Смотри здесь
Re: В каком случае деструктор вызывается несколько раз?
От: Lloyd Россия  
Дата: 20.10.08 15:37
Оценка:
Здравствуйте, visus, Вы писали:

V>Что же это получается? Вызов деструктора неопределен не только по времени, но и по количеству?


Без спецального участия объекта финалайзер будет вызван не более 1 раза. При желании можно сделать так, чтобы финалайзер вызывался сколь угодно много раз (resurrection)

V>У меня на один вызов конструктора COM объекта по 300 вызовов деструктора. Я в панике


Вы уверены, что COM-объект работает корректно?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[10]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 20.10.08 15:41
Оценка:
V>>Прочитайте пожалуйста ветку с начала. Я не искал ничего про using, вы сами себя ввели в заблуждение. И то, что вы не знали про существование "Destructors" в понимании C#, говорит о том, что вы не совсем владеете темой вопроса.

PM>Developer Guide — хорошая вещь, но книги признанные тоже являются официальными документами, которые ревьюируются не раз перед выходом.


PM>

PM>Does the Object Need a Finalizer?



Павел, вы пичкаете меня ссылками с упорством деревенского фельдшера и даже не потрудились спросить меня, а знаю ли я что такое finalizer, using, dispose, сборщик мусора и т.п. (уже перечислял). Я вас прямо спрашивал, но вы не сочли за труд объяснить, зачем вы меня лечите. За ваше упорство награждаю вас заслуженной троечкой с минусом.
С радостью сниму троечку и даже готов извиниться за что-нибудь, если вы всё таки прислушаетесь к моей просьбе обосновать вашу позицию и пояснить, зачем же мне ваши ссылки для выяснения темы "В каком случае деструктор вызывается несколько раз?".
За собой я оставляю право использовать термины деструктор и конструктор как методы, вызываемые в момент создания или уничтожения объекта.
Re[2]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 20.10.08 16:20
Оценка:
L>Вы уверены, что COM-объект работает корректно?

Уже писал, дело не в коде объекта. Пока не смог локализовать ошибку. Но обязательно разберусь когда будет немного больше времени.
Re[11]: В каком случае деструктор вызывается несколько раз?
От: Pavel M. Россия  
Дата: 20.10.08 17:02
Оценка: +2
Здравствуйте, visus, Вы писали:

V>За собой я оставляю право использовать термины деструктор и конструктор как методы, вызываемые в момент создания или уничтожения объекта.


Вы пишете в форум, я сделал пару предположений, заодно заметил про корявое использование IDisposable объектов ( не зря говорят "добрыми делами вымощена дорога в ад"). Это раз.
Да, используйте как хотите, но не ждите понимания от окружающих. И кто еще фельдшер.
--------------------------
less think — do more
Re[3]: В каком случае деструктор вызывается несколько раз?
От: _d_m_  
Дата: 20.10.08 20:36
Оценка:
Здравствуйте, visus, Вы писали:

D>>Все местные телепаты сейчас на выходных и в отпусках. Так что не паникуйте, а показывайте код.



V>~SomeObject()

V>{
V>FileStream file = File.Open("somename.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
V>Encoding enc1251 = Encoding.GetEncoding(1251);
V>StreamWriter sw = new StreamWriter(file, enc1251); // Why stack overflow?
V>sw.WriteLine("call destructor");
V>sw.Flush();
V>sw.Close();
V>}

А эксепшенов, например, здесь ни возникает?
Re[11]: В каком случае деструктор вызывается несколько раз?
От: _d_m_  
Дата: 20.10.08 20:42
Оценка: +1
Здравствуйте, visus, Вы писали:

V>>>Прочитайте пожалуйста ветку с начала. Я не искал ничего про using, вы сами себя ввели в заблуждение. И то, что вы не знали про существование "Destructors" в понимании C#, говорит о том, что вы не совсем владеете темой вопроса.



V>Павел, вы пичкаете меня ссылками с упорством деревенского фельдшера и даже не потрудились спросить меня, а знаю ли я что такое finalizer, using, dispose, сборщик мусора и т.п. (уже перечислял). Я вас


А что, должны спрашивать? Судя по корявому коду... И по испытваемым фрустрациям на тему "что вы тут мне говорите, да я и так знаю"... Ну раз все знаешь, зачем спрашиваешь?
Re[12]: В каком случае деструктор вызывается несколько раз?
От: visus  
Дата: 21.10.08 15:27
Оценка:
PM>Вы пишете в форум, я сделал пару предположений, заодно заметил про корявое использование IDisposable объектов ( не зря говорят "добрыми делами вымощена дорога в ад"). Это раз.
PM>Да, используйте как хотите, но не ждите понимания от окружающих. И кто еще фельдшер.

Я очень рад, что наконец-то наметились тенденции к диалогу без лишних ссылок. Сразу перейду к делу: этот код вообще-то рабочим кодом не является и он работает, это очевидно и вы могли бы это заметить сразу. Зачем рабочему коду писать в файл сообщение о уничтожении объекта? Как бы я узнал, что деструктор вызывается 300 раз, если бы этот код не работал?
Изначально вы сделали три неверных предположения и не обращали внимания на мои уточняющие вопросы. Так что... минусики я уберу, а фельдшера оставлю В надежде, что в будущем вы будете внимательнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.