|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
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 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,834
|
Вот эту строчку я воспринимаю как сомнительную -- с возможной утечкой памяти.
Цитата:
Попробуй описать изначальную задачу. Например, какого типа ModemWork.GetModemResponse? Что вообще нужно сделать в общем случае?
В разработке: воспроизводственный контур ИТ
|
|
24.01.2013, 09:33 | #13 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
100 костыльно
яж ему почти готовый код (с маленькой ошибкой) по всем правилам винапи (сдернуто с ReadFile) в коде только результ правильный вернуть и все готово а он перешел на пичар... фу фу фу... @Быков
Не стесняемся, плюсуем!
|
24.01.2013, 09:51 | #14 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,834
|
Тот код тоже костыльный. StrPLCopy -- костыльная функция, для обратной совместимости с теми, кто не осилил новые. А вот это вообще утечка:
Я согласен с Антоном в его недоверии к таким советчикам. И постановка "пока снята для меня проблема, а не вопрос" -- это по-нашему, это правильно.
В разработке: воспроизводственный контур ИТ
|
24.01.2013, 10:42 | #15 | |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Цитата:
Новые? показывай... Свой вариант в студию... будем сравнивать костыльность... Эта утечка намеренно тут продемонстрирована для раскрытия стиля автара, этот пример стабильно выдает AV на D7 и показан для того чтоб так не делали
Не стесняемся, плюсуем!
|
|
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 | ||||
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Цитата:
что автоматом накладывает ограничения на использование типов с магией автоуничтожения к которым относится String Цитата:
почему в приложении? а вот почему (псевдокод динамически загружаемой библиотеки) неправильный код: 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); Цитата:
Цитата:
например либа на сях ничего о дельфевом PString не знает
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 24.01.2013 в 19:16. |
||||
24.01.2013, 19:22 | #18 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
То, что память создается и выделяется в одном месте - это понятно. Я перенес это в библиотеку для большего удобства (сейчас по памяти не воспроизведу аргументов) работы с библиотекой из DotNet.
А второй пример у меня выдает AV при любом порядке GetMem'ов |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти | 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 |