5 / 5 / 0
Регистрация: 02.01.2013
Сообщений: 438
1

Утечка памяти или куда пропало =)

01.06.2015, 16:40. Показов 1062. Ответов 10
Метки нет (Все метки)

Люди всем привет Почему у меня после выполнения кода в a[0] = '' ?, когда a [1] = 'Z', a [2] = 'A'
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
 a : array[0..2] of string;
 b : array[0..2] of integer;
 i : integer;
begin
 a [0] := 'H';
 a [1] := 'Z';
 a [2] := 'A';
 for I := 0 to length(b) do
  b[i] := 0;
end;
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2015, 16:40
Ответы с готовыми решениями:

Утечка памяти в программе , как избежать или как правильно уничтожить объект?
Ребят помогите создал класс , вызываю его Creat после destroy ,проект работает только вот память...

Утечка памяти
Есть ли в Delphi 6 встроенные глюки, из-за которых может возникать утечка памяти? Конкретно...

Утечка памяти
Проверил утечку памяти ReportMemoryLeaksOnShutdown , выдало 13 - 20 bytes: UnicodeString x 86 ,...

Утечка памяти
Доброго времени суток! Подскажите, пожалуйста: Нужно залить много мелких файлов (до 1 Мб)....

10
пофигист широкого профиля
4436 / 2926 / 828
Регистрация: 15.07.2013
Сообщений: 16,850
01.06.2015, 17:11 2
Цитата Сообщение от alex-rudenkiy Посмотреть сообщение
Почему у меня после выполнения кода
"После выполнения кода" это когда именно? До 11-й строчки или после нее?
0
52 / 52 / 25
Регистрация: 07.12.2011
Сообщений: 115
01.06.2015, 17:14 3
Delphi XE5 полет нормальный

a[0]='H'
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
01.06.2015, 18:49 4
Цитата Сообщение от alex-rudenkiy Посмотреть сообщение
у меня после выполнения кода в a[0] = ''
Как ты это определяешь ?
0
5 / 5 / 0
Регистрация: 02.01.2013
Сообщений: 438
01.06.2015, 18:55  [ТС] 5
вот так
Миниатюры
Утечка памяти или куда пропало =)  
0
5 / 5 / 0
Регистрация: 02.01.2013
Сообщений: 438
01.06.2015, 19:09  [ТС] 6
Всё разобрался, не внимательность
0
Продавец времени
6055 / 3331 / 768
Регистрация: 12.03.2015
Сообщений: 15,897
01.06.2015, 21:44 7
Цитата Сообщение от alex-rudenkiy Посмотреть сообщение
Всё разобрался, не внимательность
чо было-то?
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
01.06.2015, 21:52 8
Цитата Сообщение от Verevkin Посмотреть сообщение
чо было-то?
length(b) = 3

Добавлено через 49 секунд
т.е. выход за границы массива.
0
5 / 5 / 0
Регистрация: 02.01.2013
Сообщений: 438
01.06.2015, 22:22  [ТС] 9
ага
0
пофигист широкого профиля
4436 / 2926 / 828
Регистрация: 15.07.2013
Сообщений: 16,850
02.06.2015, 01:54 10
Цитата Сообщение от FIL Посмотреть сообщение
т.е. выход за границы массива.
Неужели в этом причина?
0
13074 / 5859 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
02.06.2015, 08:20 11
Лучший ответ Сообщение было отмечено alex-rudenkiy как решение

Решение

Цитата Сообщение от northener Посмотреть сообщение
Неужели в этом причина?
Да - причина в этом. Когда компилятор собирает сведения о переменных, объявленных в программе, он их складывает в стек. В стеке сведения о переменных следуют в обратном порядке относительно их объявления в программе. Потом компилятор выталкивает описания из стека и размещает соответствующие переменные в памяти последовательно в порядке возрастания адресов. Т. е., если в программе имеются объявления:
Delphi
1
2
3
4
var
  a : array[0..2] of string;
  b : array[0..2] of integer;
  i : integer;
тогда компилятор сначала сложит эти описания в стек. В стеке их порядок будет следующим (вершина - дно):
Код
  i : integer;
  b : array[0..2] of integer;
  a : array[0..2] of string;
Затем, описания будут последовательно извлечены из стека и компилятор разместит переменные в памяти друг за другом в порядке возрастания адресов: i, b, a.
Таким образом, массив "a" следует сразу же за правой границей массива "b". Поэтому, если где-то в коде при записи произойдёт выход за правую границу массива "b", то начнётся запись в область, где расположен массив "a".
В данном случае при выполнении команды:
Delphi
1
  b[3] := 0;
произойдёт запись нуля в элемент a[0]. Таким образом получим: a[0] = 0 = nil. Что соответствует пустой строке в элементе a[0]. Именно этот эффект и произошёл у автора темы.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2015, 08:20

Утечка памяти в WaitForMultipleObjects
Добрый день Возникла проблема при вызове WaitForMultipleObjects. Каждый раз при ее вызове...

Утечка памяти в функции
Добрый вечер, есть функция: function BmpToMem1(Bmp:TBitmap;var W,H:integer):pointer; var ...

Утечка памяти в потоке
Что я делаю не так procedure TMainThredRec.Execute; function BmpToMem(Bmp:TBitmap;var...

WebBrowser и утечка памяти
Есть программа которая циклично заходит на страницы, берёт код страницы и заполняет формы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.