|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
22.01.2013, 14:36 | #1 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Выделение малых фрагментов памяти в dll
Коллеги. Не подскажет ли кто - в какую сторону можно посмотреть. Есть вот такой код (delphi XE) работы с AT-модемом.
Код:
Код:
|
22.01.2013, 14:46 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Ошибка здесь:
Код:
И для FreeMem не надо явно указывать размер высвобождаемой памяти, он сам это делает. |
22.01.2013, 15:06 | #3 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Это лихо вы PString пользуете, думаете не String и в DLL проканает?
TempS - тип какой? string? если да то что для вас такое string? указатель на массив символов? - нет нет и нет... это указатель на структуру типа StrRec для удобства значение смещено на SizeOf(StrRec) чтоб сразу полезные данные шли в 7дельфе строка это StrRec = packed record refCnt: Longint; length: Longint; end; в вашей реализации псевдо строки этого нет что при выполнении Res^:=TempS; все ломает
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 22.01.2013 в 15:10. |
22.01.2013, 15:10 | #4 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
|
22.01.2013, 15:19 | #5 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Код:
использование Код:
Не стесняемся, плюсуем!
|
22.01.2013, 15:24 | #6 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
а ещё выкинуть STRING из проекты и использовать PChar или WideString или же использовать STRING и таскать с собой SHAREMEM
|
22.01.2013, 16:03 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
22.01.2013, 19:24 | #8 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Slym, у меня тогда несколько уточняющих вопросов и замечаний:
1) Где указан запрет на работу со строчными ссылочными типами таким образом? p:=^.. (ну хранится указанная Вами структура с отрицательным смещением от адреса переменной и данных, ну разная эта структура для юникода и анси. И что? Язык и логика работы с указателями вроде в этом смысле остаются прежними). 2) Эта проблема была и в доюникодовом d2007 (первоначально библиотека писалась под ним). 3) Проблема есть только для строк размером 2-6 (примерно) символов, она ни одного раза не проявилась на строках большей длины, а длина там бывает на порядок-два больше. Последний раз редактировалось Антон Ю.Б.; 22.01.2013 в 19:52. |
23.01.2013, 06:01 | #9 | |||
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Цитата:
Код:
Цитата:
Цитата:
[память] строка1строка2 операция со строка2 приведет к порче строка1, т.к. по месту должны быть поля RefCount и Length [память] 0010007строка2 или же авто освобождение compiller magic строки строка2 вызовет FreeMem ока1 - байт (поле Length) что гораздо больше 7 байт или не вызовет вовсе т.к. RefCount 0стр - больше 0
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 23.01.2013 в 06:03. |
|||
23.01.2013, 06:19 | #10 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
у тебя работает этот код?
Код:
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 23.01.2013 в 06:21. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти | Blind Guard | Общие вопросы C/C++ | 22 | 06.06.2012 19:48 |
Распределение памяти. Динамическое выделение памяти с++ | Tolian92 | Помощь студентам | 8 | 14.05.2012 21:44 |
Определить SIZEMEM у DLL(Размер dll в памяти процесса) | Человек_Борща | Общие вопросы Delphi | 6 | 22.07.2011 20:54 |
Выделение памяти в С++ | Dj-IIyIIc | Общие вопросы C/C++ | 4 | 18.10.2010 14:39 |
выделение памяти | Артем1256 | Общие вопросы C/C++ | 1 | 13.11.2009 16:38 |