|
Вопрос # 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сця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|