Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 003

/ вопрос открыт /

Здравствуйте, эксперты!
помогите разобраться, использую в проекте глобальную переменную типа string после компиляции и работы программы вылетает ошибка "Исключение неизвестное программное исключение (0x0eedfade) приложение по адресу 0x7c812a6b" долго бился, перечитал кучу инфы где ругают использование глобальных переменных в программе, толком понял одно, что использование глобальных переменных увеличивает размер сегмента данных приложения. Решил изменить тип переменной на shortstring ошибка пропала, но вот что интересно, в information for Project1 дана следующая статистика:
для случая со string:
data size 9557 byte
для случая со shortstring
data size 9809
Получается что короткая строка использует больше объема памяти, почему тогда исчезла ошибка?

Казаков Николай Константинович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Казаков Николай Константинович (статус: 1-ый класс)
Вопрос отправлен: 7 февраля 2011, 13:30
Состояние вопроса: открыт, ответов: 1.

Ответ #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™

min@y™ (статус: Доктор наук), 7 февраля 2011, 13:36 [#1]:

Ну, естественно, ошибка в 17-й строке. К бабке не ходи!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

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

bugmenot (статус: 3-ий класс), 7 февраля 2011, 20:10 [#5]:

> про data/bss не слышал раньше
сегменты данных, инициализированные/неинициализированные

да, ShortString - статический тип, что и отражается в инфе по проекту (а лучше сгенерируй карту и там сам увидишь все подробности)
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.