Конференция ".Net" » StackOverflowException [C#, WinXP]
 
  • как - то так (20.07.08 22:21) [0]
    Есть 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();
          }
    Все работает...
  • boa_kaa © (21.07.08 00:52) [1]
    а код-то можно увидеть?
    или секрет страшный?
  • как - то так (21.07.08 02:44) [2]
    Код не секретный, но страшный :)

    Тут странная история: библиотеку компилирую сам, кидаю в  папку к компонену (тоже сам пишу)(библиоткеку к компоненту добавил через Add reference). Постоянно изменяю что - то в библиотеке, и кидаю снова к компоненту.
    Компилирую компонент, запускаю в дебаг режиме - при определеных условиях (вызов метода из библиотеки, который еще 6 методов вызывает) вываливается, причём в студии (VS2008) открывается код библиотеки, и желтым выделяется строка (с подпсью анхендлед стек оверфлоу эксепшн). Раньше выделялась та, что выше привёл, а сейчас - фигурная скобочка в начале совсем другого метода (я тот код преписал, без массива, так что дело не в нем). (вообще, если вставить на место скобки строку "//Здесь был Вася" - выделится она)

    Получается, когда компилирую компонент, студия берет код не из последней библиотеки, а откуда - то из старого(откуда?).

    Почитал что нашел по компиляции дотнета (под рукой только Рихтер и гугл), ответа на вопрос не нашел.
    Код не привожу, там больше 1000 строк

    P.S. рекурсии все - еще нигде в коде нет
  • b z (21.07.08 10:41) [3]

    > библиотеку компилирую сам, кидаю в  папку к компонену (тоже
    > сам пишу)(библиоткеку к компоненту добавил через Add reference)
    Зачем кидать? Укажите в свойствах reference копировать локально.
    Брать может из кэша, но такие случаи очень редки, и то часто в следствии именного "ручного" вмешательства, пробуйте не мешать студии.
  • boa_kaa © (21.07.08 13:18) [4]
    а библиотека в сольюшене?
  • Как - то так (21.07.08 14:20) [5]
    Да, в солюшене.
    Впрочем, с библиотекой разобрался.
    Эксепшн вываливается вот на этом месте:
    private Move MoveGen(SByte fx, SByte fy, SByte px, SByte py)
           {
              Move m = new Move()

    метод вызывается много раз подряд (от 1 до примерно 100 в зависимости от доп. условий). Я так понимаю объект m не успевает уничтожиться сборщиком мусора.
    Но как - то наследовать класс Move от CriticalFinalizerObject и IDisposable не хочется (накладные расходы, класс простой и этот код должен максимально быстро работать). Может, есть другой способ?
  • Как - то так (21.07.08 14:41) [6]
    сделал Move : IDisposable, засунул в using. Все - равно ексепшн появляется...
  • boa_kaa © (21.07.08 19:27) [7]

    > private Move MoveGen(SByte fx, SByte fy, SByte px, SByte
    > py)        {           Move m = new Move()метод вызывается
    > много раз подряд (от 1 до примерно 100 в зависимости от
    > доп. условий). Я так понимаю объект m не успевает уничтожиться
    > сборщиком мусора.

    нет, здесь нет ошибки
    она возникает в другом месте
    и сборщик мусора здесь не причем
  • clickmaker © (22.07.08 09:27) [8]
    > Move m = new Move()

    а после этого что?
  • Как - то так (22.07.08 16:18) [9]
    после этого много присвоений открытым полям 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. Так должно быть?
  • b z (23.07.08 09:31) [10]

    > стек оверфлоу возникает теперь
    Может уже пора прочитать про этот злополучный "стек оверфлоу", и сделать соотв. выводы?
  • Как - то так (25.07.08 13:46) [11]

    > Может уже пора прочитать про этот злополучный "стек оверфлоу",
    >  и сделать соотв. выводы?


    Так и зделал. Помогло. Всем спасибо за внимание
 
Конференция ".Net" » StackOverflowException [C#, WinXP]
Есть новые Нет новых   [134427   +34][b:0][p:0]