Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 23:11   #11
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

Перешел на PChar, StrAlloc, StrCopy, SetString, StrDispose. Все работает без ошибок.

PString (а теперь соответственно PChar) я использовал только потому, что почему-то при приеме строки типа String из dll она обрезалась до первого перевода строки. Но это пояснение к причине вопроса отношения не имеет.

А к причине вопроса имеет отношение все-таки то, что если у меня есть базовый тип (пусть string сам по себе и не самый простой тип), и я имею право образовывать тип ссылочный от него, то при выделении памяти на мне лежит задача указать полезную нагрузку (размер, зависящий от длины строки), а вот выделение вспомогательных вещей со сдвигом влево от полезной нагрузки - это задача компилятора, если описание GetMem не имеет предупреждений об особых случаях. Я могу ошибаться, но вроде бы не имеет. Поэтому я не вижу ошибки в коде вопроса, и пока снята для меня проблема, а не вопрос.
Антон Ю.Б. вне форума Ответить с цитированием
Старый 24.01.2013, 09:15   #12
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,776
По умолчанию

Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
Код:
        Res^:=TempS;
Вот эту строчку я воспринимаю как сомнительную -- с возможной утечкой памяти.

Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
Перешел на PChar, StrAlloc, StrCopy, SetString, StrDispose. Все работает без ошибок.
Даже не видя кода, предполагаю, что решение все же костыльное.

Попробуй описать изначальную задачу. Например, какого типа ModemWork.GetModemResponse? Что вообще нужно сделать в общем случае?
Vapaamies вне форума Ответить с цитированием
Старый 24.01.2013, 09:33   #13
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

100 костыльно
яж ему почти готовый код (с маленькой ошибкой) по всем правилам винапи (сдернуто с ReadFile)
в коде только результ правильный вернуть и все готово
а он перешел на пичар... фу фу фу... @Быков
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 24.01.2013, 09:51   #14
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,776
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
яж ему почти готовый код (с маленькой ошибкой)
Тот код тоже костыльный. StrPLCopy -- костыльная функция, для обратной совместимости с теми, кто не осилил новые. А вот это вообще утечка:
Цитата:
Сообщение от Slym Посмотреть сообщение
Код:
  s2^:=S1^+'76543210';
Я согласен с Антоном в его недоверии к таким советчикам. И постановка "пока снята для меня проблема, а не вопрос" -- это по-нашему, это правильно.
Vapaamies вне форума Ответить с цитированием
Старый 24.01.2013, 10:42   #15
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Тот код тоже костыльный. StrPLCopy -- костыльная функция, для обратной совместимости с теми, кто не осилил новые. А вот это вообще утечка:
StrPLCopy костыльная в D7? прув в студию
Новые? показывай...
Свой вариант в студию... будем сравнивать костыльность...

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Я согласен с Антоном в его недоверии к таким советчикам. И постановка "пока снята для меня проблема, а не вопрос" -- это по-нашему, это правильно.
Эта утечка намеренно тут продемонстрирована для раскрытия стиля автара, этот пример стабильно выдает AV на D7 и показан для того чтоб так не делали
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 24.01.2013, 16:39   #16
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

Коллеги, я рад за ваши познания, но все же дословно правильный ответ на мой вопрос был бы "In case of a typed pointer, you should consider the New and Dispose procedures, which respectively initialize and finalize the memory block accordingly".

При этом ответе сохранялись бы исходные типы переменных и используемые процедуры в своей прежней логике.

В первом примере не одна, а две ошибки, вынос выделения памяти на сторону приложения, изменение логики использования процедур.

Второй пример не будет в общем случае работать и при перестановке строк местами.

При использовании New-Dispose строки, названные вами утечками, вовсе не являются таковыми, да и собственно подаются разработчиками как образец правильной работы.
Антон Ю.Б. вне форума Ответить с цитированием
Старый 24.01.2013, 19:13   #17
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
Коллеги, я рад за ваши познания, но все же дословно правильный ответ на мой вопрос был бы "In case of a typed pointer, you should consider the New and Dispose procedures, which respectively initialize and finalize the memory block accordingly".
При этом ответе сохранялись бы исходные типы переменных и используемые процедуры в своей прежней логике.
и при этом нельзя делать New и Dispose в разных модулях -где создал там убил
что автоматом накладывает ограничения на использование типов с магией автоуничтожения к которым относится String


Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
В первом примере не одна, а две ошибки, вынос выделения памяти на сторону приложения, изменение логики использования процедур.
Обычно так и делается... Память тебе дается менеджером памяти, и вернуть ты должен память тому же менеджеру у которого взял. В приложении свой менеджер, а в длл другой менеджер, кроме того dll может быть скомпилена другим компилятором
почему в приложении?
а вот почему (псевдокод динамически загружаемой библиотеки)
неправильный код:
lib:=LoadLibrary(lib.dll)
Proc:=GetProcAddres(Lib,'Proc');
Pointer:=Proc(GetSomeData);//память выделена в длл
FreeLibrary(lib);
Caption:=Pointer; // AV т.к. менеджер памяти в длл все за собой зачистил

правильный код:
lib:=LoadLibrary(lib.dll)
Proc:=GetProcAddres(Lib,'Proc');
GetMem(Pinter,DataSize);//память выделена в exe
Proc(GetSomeData,Pointer,DataSize);
FreeLibrary(lib);
Caption:=Pointer;
FreeMem(Pointer);



Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
Второй пример не будет в общем случае работать и при перестановке строк местами.
РАБОТАТЬ? Не выдавать явно (AV) ошибку... Явная ошибка себя не проявит при перестановке...

Цитата:
Сообщение от Антон Ю.Б. Посмотреть сообщение
При использовании New-Dispose строки, названные вами утечками, вовсе не являются таковыми, да и собственно подаются разработчиками как образец правильной работы.
образец дают в автономном приложении, распределенное приложение накладывает дополнительные ограничения.
например либа на сях ничего о дельфевом PString не знает
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 24.01.2013 в 19:16.
Slym вне форума Ответить с цитированием
Старый 24.01.2013, 19:22   #18
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

То, что память создается и выделяется в одном месте - это понятно. Я перенес это в библиотеку для большего удобства (сейчас по памяти не воспроизведу аргументов) работы с библиотекой из DotNet.

А второй пример у меня выдает AV при любом порядке GetMem'ов
Антон Ю.Б. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти 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