-
Есть dll сборка, в ней класс, в нем метод, метод начинается с: Move[] mv = new Move[50]; Муви - это класс из то же сборки. В нём 8 однобайтовых полей, конструктор и всё. Так вот, вызываю метод из приложения, и приложение вываливается с сообщением о переполнении стека. VS показывает как раз на строку Move[] mv = new Move[50]; Реурсии нигде не используется. В чём может быть проблема? P.S. сделал консольку, в ней пишу: static void Main(string[] args) { Move[] mv = new Move[10000]; Console.WriteLine("OK"); Console.ReadKey(); } Все работает...
-
а код-то можно увидеть? или секрет страшный?
-
Код не секретный, но страшный :)
Тут странная история: библиотеку компилирую сам, кидаю в папку к компонену (тоже сам пишу)(библиоткеку к компоненту добавил через Add reference). Постоянно изменяю что - то в библиотеке, и кидаю снова к компоненту. Компилирую компонент, запускаю в дебаг режиме - при определеных условиях (вызов метода из библиотеки, который еще 6 методов вызывает) вываливается, причём в студии (VS2008) открывается код библиотеки, и желтым выделяется строка (с подпсью анхендлед стек оверфлоу эксепшн). Раньше выделялась та, что выше привёл, а сейчас - фигурная скобочка в начале совсем другого метода (я тот код преписал, без массива, так что дело не в нем). (вообще, если вставить на место скобки строку "//Здесь был Вася" - выделится она)
Получается, когда компилирую компонент, студия берет код не из последней библиотеки, а откуда - то из старого(откуда?).
Почитал что нашел по компиляции дотнета (под рукой только Рихтер и гугл), ответа на вопрос не нашел. Код не привожу, там больше 1000 строк
P.S. рекурсии все - еще нигде в коде нет
-
> библиотеку компилирую сам, кидаю в папку к компонену (тоже > сам пишу)(библиоткеку к компоненту добавил через Add reference) Зачем кидать? Укажите в свойствах reference копировать локально. Брать может из кэша, но такие случаи очень редки, и то часто в следствии именного "ручного" вмешательства, пробуйте не мешать студии.
-
а библиотека в сольюшене?
-
Да, в солюшене. Впрочем, с библиотекой разобрался. Эксепшн вываливается вот на этом месте: private Move MoveGen(SByte fx, SByte fy, SByte px, SByte py) { Move m = new Move()
метод вызывается много раз подряд (от 1 до примерно 100 в зависимости от доп. условий). Я так понимаю объект m не успевает уничтожиться сборщиком мусора. Но как - то наследовать класс Move от CriticalFinalizerObject и IDisposable не хочется (накладные расходы, класс простой и этот код должен максимально быстро работать). Может, есть другой способ?
-
сделал Move : IDisposable, засунул в using. Все - равно ексепшн появляется...
-
> private Move MoveGen(SByte fx, SByte fy, SByte px, SByte > py) { Move m = new Move()метод вызывается > много раз подряд (от 1 до примерно 100 в зависимости от > доп. условий). Я так понимаю объект m не успевает уничтожиться > сборщиком мусора.
нет, здесь нет ошибки она возникает в другом месте и сборщик мусора здесь не причем
-
> Move m = new Move()
а после этого что?
-
после этого много присвоений открытым полям m значений, и reurn m; Там ошибки тоже нет.
Перенес классы в консольное приложение, стек оверфлоу возникает теперь: private Boolean FieldAttacked(SByte x, SByte y, Boolean white) { SByte i, Yd;
в поле local написано: i Cannot obtain value of local or argument 'i' as it is not available at this instruction pointer, possibly because it has been optimized away. sbyte
То же самое про Yd; Что это за ошибка?
И еще: this равно null. Так должно быть?
-
> стек оверфлоу возникает теперь Может уже пора прочитать про этот злополучный "стек оверфлоу", и сделать соотв. выводы?
-
> Может уже пора прочитать про этот злополучный "стек оверфлоу", > и сделать соотв. выводы?
Так и зделал. Помогло. Всем спасибо за внимание
|