| 
| 
 | Вопрос # 5 003/ вопрос открыт / | 
 |  Здравствуйте, эксперты!помогите разобраться, использую в проекте глобальную переменную типа string после компиляции и работы программы вылетает ошибка "Исключение неизвестное программное исключение (0x0eedfade) приложение по адресу 0x7c812a6b" долго бился, перечитал кучу инфы где ругают использование глобальных переменных в программе, толком понял одно, что использование глобальных переменных увеличивает размер сегмента данных приложения. Решил изменить тип переменной на shortstring ошибка пропала, но вот что интересно, в information for Project1 дана следующая статистика:
 для случая со string:
 data size 9557 byte
 для случая со shortstring
 data size 9809
 Получается что короткая строка использует больше объема памяти, почему тогда исчезла ошибка?
 Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Казаков Николай Константинович!Могу ответить на вторую половину вопроса и попытаться ответить на первую.
 Почему такая разница? да все просто. Нужно понимать, что shortstring - это 256 байт в памяти стека. А обычный string - это 4 байта в стеке и до 2 гигабайт в куче.
 Теперь простая арифметика.
 9809-9557 = 252, а это как раз 256 - 4. По другому. в начале у нас было 9553 байт каких-то данных и 256 байт под строку shortsting, а после замены - 9553 + 4 байта под string. То есть все очень хорошо сходится.
 А вот теперь по поводу исключения. Желательно показать тот участок кода, который работает с этой строкой. Но возможно следующие вопросы наведут Вас самостоятельно на ответ.
 - не используется ли dll ?
 - не используется ли эта строка как работы с API функциями
 - не используются ли указатели на эту строку
 - не предпринимаются ли попытки обмануть компилятор? (хитрые привидения типов, использование недокументированных возможностей)
 - какая версия делфи?
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 7 февраля 2011, 13:52
 
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 7 февраля 2011, 20:10; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 7 февраля 2011, 13:36 [#1]:Ну, естественно, ошибка в 17-й строке. К бабке не ходи! Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | bugmenot (статус: 3-ий класс), 7 февраля 2011, 14:19 [#2]:длиные строки хранятся в куче, короткие - в .data/.bss виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Казаков Николай Константинович (статус: 1-ый класс), 7 февраля 2011, 14:55 [#3]:когда искал ошибку сокращал код до минимума получилось, что с использованием глобальной переменной осталась одна строка stNamePart:=vCObj.stProduct;
 stNamePart - глобальная переменная типа string, а vCObj.stProduct глобальная переменная тип string;
 а место под string выделяется динамически? Если да, то возможно во время присваивания было выделено какой то объем памяти под строку, а при завершении приложения произошло непраывильное очищение. Может быть такое? ведь после замены на shortstring ошибки не стало )). А про data/bss не слышал раньше, что это?
 |  
|   | Вадим К (статус: Академик), 7 февраля 2011, 15:07 [#4]:а что такое vCObj ? больше похоже на расстрел памяти.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 7 февраля 2011, 20:10 [#5]:> про data/bss не слышал раньше сегменты данных, инициализированные/неинициализированные
 
 да, ShortString - статический тип, что и отражается в инфе по проекту (а лучше сгенерируй карту и там сам увидишь все подробности)
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |