IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Отлов утечек памяти - GNAT, (разделено)
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Новые вопросы - какая функция определяет наличие или отсутствие утечек памяти?
Я скачал ВинАДУ, поставил, как подключить пакет, содержащий заголовки виндовых библиотек? with ADA.Windows не рабтает, нет такого пакета.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ещё вопрос.
Контролируемые объекты, созданные, как промежуточный результат вычислений, удаляются уже после вычислений же?



procedure Test is

type aString is access all String;
type aChar is access all Character;

for aString'Storage_Pool use Debug_Options.D_Pool;

type cStr is new Ada.Finalization.Controlled with record
r: aString;
end record;

procedure Initialize(a: in out cStr);
procedure Finalize(a: in out cStr);

procedure Initialize(a: in out cStr) is
begin
a.r := null;
end;

procedure Finalize(a: in out cStr) is
procedure Free is new ADA.Unchecked_Deallocation(String, aString);
begin
if a.r /= null then
Free(a.r);
end if;
end;
--------------------------------------------------------------------------------
function To_CStr (S: String) return cStr is
result: cStr;
begin
result.r := new String(1 .. S'Length);
result.r.all := S;
return result;
end;

begin
#if Test_Leaks
GNAT.Debug_Pools.Configure (D_Pool, Raise_Exceptions => False);
#end if;

Put_Line(To_CStr("TEST").r.all);

#if Test_Leaks
GNAT.Debug_Pools.Print_Info_Stdout (D_Pool, Display_Leaks => True);
#end if;
end Test;




Выдаёт
C:\Program\ Files\ADA\projects\test\test
error: Accessing deallocated storage, at 0x6A3079AF 0x6A2CBF61 0x6A2CDC15 0x0041A416 0x0040178C 0x004010B4 0x00401146 0x7C817065
First deallocation at 0x6A3079AF 0x6A2CC522 0x6A2CE042 0x0041ABB2 0x6A31EEB8 0x0041AB0B 0x0041AA9B 0x0041A262 0x0040178C 0x004010B4 0x00401146 0x7C817065
Initial allocation at 0x6A3079AF 0x6A2CC522 0x6A2CEB62 0x0041A78E 0x0041A262 0x0040178C 0x004010B4 0x00401146 0x7C817065
TEST
error: Freeing already deallocated storage, at 0x6A3079AF 0x6A2CBF61 0x6A2CE4EB 0x0041ABB2 0x6A31EEB8 0x0041A53E 0x0041A44E 0x0040178C 0x004010B4 0x00401146 0x7C817065
Memory already deallocated at 0x6A3079AF 0x6A2CC522 0x6A2CE042 0x0041ABB2 0x6A31EEB8 0x0041AB0B 0x0041AA9B 0x0041A262 0x0040178C 0x004010B4 0x00401146 0x7C817065
Memory was allocated at 0x6A3079AF 0x6A2CC522 0x6A2CEB62 0x0041A78E 0x0041A262 0x0040178C 0x004010B4 0x00401146 0x7C817065
Total allocated bytes : 12
Total logically deallocated bytes : 12
Total physically deallocated bytes : 0
Current Water Mark: 0
High Water Mark: 12


List of not deallocated blocks:
[2011-02-22 11:15:27] process terminated successfully (elapsed time: 00.18s)


Видимо проблема в том, что return объект делает finalize и adjust. (зачем?)


Кстати, как сделать, чтобы инициализация отладчика не перекидывала меня с той страницы, что я смотрю?


Добавлено через 13 мин.
Попытка следующая. Чтобы не копировать строку лишний раз, лепим счётчик ссылок.


procedure Test is

type Cnt_Str(i: integer) is record
rc: integer;
s: string(1 .. i);
end record;

type aCnt_Str is access all Cnt_Str;
type aChar is access all Character;

for aCnt_Str'Storage_Pool use Debug_Options.D_Pool;

type cStr is new Ada.Finalization.Controlled with record
r: aCnt_Str;
end record;

procedure Initialize(a: in out cStr);
procedure Finalize(a: in out cStr);
procedure Adjust(a: in out cStr);

procedure Initialize(a: in out cStr) is
begin
a.r := null;
end;

procedure Finalize(a: in out cStr) is
procedure Free is new ADA.Unchecked_Deallocation(Cnt_Str, aCnt_Str);
begin
if (a.r /= null) then
a.r.rc := a.r.rc - 1;
if a.r.rc = 0 then
Free(a.r);
end if;
end if;
end;

procedure Adjust(a: in out cStr) is
begin
a.r.rc := a.r.rc + 1;
end;
--------------------------------------------------------------------------------
function To_CStr (S: String) return cStr is
result: cStr;
begin
result.r := new Cnt_Str(S'Length);
result.r.rc := 1;
result.r.s := S;
return result;
end;

begin
#if Test_Leaks
GNAT.Debug_Pools.Configure (D_Pool, Raise_Exceptions => False);
#end if;

Put_Line(To_CStr("TEST").r.s);

#if Test_Leaks
GNAT.Debug_Pools.Print_Info_Stdout (D_Pool, Display_Leaks => True);
#end if;
end Test;



Программа вылетает на
result.r := new Cnt_Str(S'Length);

Добавлено через 9 мин.
А на самом деле я хочу, чтобы можно было писать хотя бы так:

CreateWindow(..., TO_WIDE(ClassName).s, TO_WIDE(Title).s, ....)

(т.е. TO_WIDE создаёт объект,внутри которого есть как и ссылка на строку с добавленным нулём, там и ссылка на первый символ этой строки (поле s), и чтобы не надо было руками этот объект удалять).

Ещё проблема: когда у меня это работало, русские символы превращались в две закорючки.

А по поводу return ов - паскалевская идея с переменной, куда пишется результат, мне нравится больше, потому что сразу всё пишется в результат, без лишнего копирования.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
TarasBer   Отлов утечек памяти - GNAT   7.02.2011 14:51
volvo   Целый пакет есть для этого: with GNAT.Debug_Pools;…   7.02.2011 15:18
TarasBer   > Целый пакет есть для этого: Всё по нулям выв…   7.02.2011 15:58
volvo   Не навсегда, а для данного проекта. Странно... По…   7.02.2011 16:19
TarasBer   Всё равно непонятно. Как его подключить к указател…   7.02.2011 16:34
volvo   , то не надо его подключать. Это только средство о…   7.02.2011 17:15
TarasBer   > Закончил отладку (убедился, что утечек нет) -…   7.02.2011 17:36
volvo   Можно, но это плохая идея. Дело в том, что глобаль…   7.02.2011 19:24
TarasBer   > ("-gnateDDEBUGGING=True") А для эт…   7.02.2011 19:50
volvo   Разумеется. Ключ -gnateD создает символ для условн…   7.02.2011 20:21
TarasBer   В общем, заставить определять некорректные выражен…   8.02.2011 16:34
volvo   Ну, в принципе все нормально. Только непонятно, по…   8.02.2011 18:36
TarasBer   Summ и Prod пока действительно не нужны. Это я доб…   8.02.2011 18:54
volvo   Ну да, и так тоже можно... Можешь, конечно, напис…   8.02.2011 19:25
TarasBer   > Можешь, конечно, написать, только компилирова…   8.02.2011 19:43
volvo   Хм... А чего ты вручную организуешь циклы по конте…   9.02.2011 0:18
-TarasBer-   > Да и еще я где-то видел цикл по всему контейн…   9.02.2011 1:21
TarasBer   А как сделать так, чтобы код между #if Test_Lea…   9.02.2011 15:15
volvo   & ("-gnateDTest_Leaks=False")   9.02.2011 15:25
TarasBer   Тоже не помогло. Главное, я нажимаю ctrl+F9, а про…   9.02.2011 15:46
volvo   После того, как внес изменения (если делал это чер…   9.02.2011 16:10
TarasBer   > В настройках проекта Recompile if switches ch…   9.02.2011 16:20
volvo   Ну, там например не было препроцессора. А здесь ма…   9.02.2011 16:47
TarasBer   > Ну, там например не было препроцессора. В та…   9.02.2011 16:54
volvo   Это не препроцессор. Вот когда перед компиляцией ф…   9.02.2011 17:17
TarasBer   > А комбинировать условия через Or/And? or: {…   9.02.2011 17:31
volvo   Затем, что не всегда допустимо править исходники. …   9.02.2011 17:50
TarasBer   > Вот если я хочу в программу запихать дату и в…   9.02.2011 18:30
volvo   Ага, щаззз... with ada.Calendar; with ada.Calenda…   9.02.2011 18:50
TarasBer   То есть константы считаются не компилятором, а про…   9.02.2011 19:04
volvo   Ada.Calendar.Clock - это все-таки функция. То есть…   9.02.2011 21:26
volvo   Я бы немного "разгрузил" функцию от множ…   10.02.2011 3:08
TarasBer   Ну это тоже можно. Гораздо хуже, что операторы и ф…   10.02.2011 15:36
volvo   А что мне надо сделать (какую строку входную заста…   10.02.2011 16:59
TarasBer   В данном случае оно не вызывается, потому что прог…   10.02.2011 17:06
volvo   Ну, тогда без проверки: function To_Vector (A …   10.02.2011 18:05
TarasBer   Я так и не понял механизм контролируемых типов. Чт…   21.02.2011 21:10
volvo   Если дословно (буква в букву) переписать все, что …   21.02.2011 21:41
-TarasBer-   > Это жестко зашито в GNAT. То есть работает и…   21.02.2011 23:03
volvo   Хм. Ну, разницы с тем, что я привел - никакой. И т…   22.02.2011 2:38
-TarasBer-   А, ну то есть ровно то, что я и сказал, судя по ка…   22.02.2011 3:29
TarasBer   Ещё вопрос. Контролируемые объекты, созданные, как…   22.02.2011 15:22
volvo   Во-первых, не надо делать лишних вещей, Ада позвол…   22.02.2011 16:42
TarasBer   > Куда девалась память (часть 1) > Куда дева…   22.02.2011 18:46
volvo   Я сомневаюсь, что это вообще исправимо. Где-то на …   22.02.2011 18:54
TarasBer   > тем более что подавляющее большинство разрабо…   22.02.2011 19:39
volvo   Да, пока я оставил и там и там, сервисы Гугла был…   22.02.2011 19:48
TarasBer   Расширенный возврат - мощная вещь, только зачем на…   24.02.2011 15:01
volvo   Потому что не всегда можно обойтись без описания т…   24.02.2011 15:39
TarasBer   > return Value do Ну например return Value(1 .…   24.02.2011 16:46
volvo   У меня системная кодировка = Hebrew (win 1255), не…   24.02.2011 17:35
TarasBer   > Это будет работать ровно до тех пор, пока ты …   24.02.2011 17:43
volvo   Ты можешь гарантировать, что "просто строка…   24.02.2011 17:48
TarasBer   Я уверен только в том, что на другой машине, где с…   24.02.2011 18:34
TarasBer   Решил я применить расширенный возврат к функции пр…   14.03.2011 16:19
volvo   Внимательнее будь. Это основа успеха при освоении …   14.03.2011 18:05
TarasBer   И всё-таки, как это сделать без непроверенной конв…   14.03.2011 18:19
volvo   Да легко: function To_Vector(a: Key_Arr) return K…   14.03.2011 19:26
TarasBer   Это уже получше. И ещё вопрос: как унаследоваться …   14.03.2011 19:32
volvo   Непонятно, зачем наследоваться от отдельного типа,…   14.03.2011 20:56


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 9:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name