Насчёт строк. Выделяй globalalloc'ом, и освобождай globalfree. И никаких проблем.
Другой вопрос, что хорошим тоном, вроде как, считается освобождение памяти на том же уровне, где она выделялась, но это не аксиома.
iGrok писал(а):Насчёт строк. Выделяй globalalloc'ом, и освобождай globalfree. И никаких проблем.
Хакер писал(а):Вызываемая функция не выделяет память, а получает указатель на (заранее выделенный вызывающей стороной) буфер. И пишет туда, если размер подходящий. Соответственно, отвечает за буфер вызывающая сторона.
Хакер писал(а):Для любой функции, которая что-то выделяет, создаётся парная функция, которая это что-то уничтожает. CreateXXX/DestroyXXX.
Хакер писал(а):В COM исповедуется концепция аллокатора: есть объект-аллокатор, поддерживающий интерфейс IMalloc. И вызывающая, и вызываемая сторона владеет аллокатором, так что память, выделенная в вызываемой стороне, может быть спокойно высвобождена в вызывающей вызовом к тому же аллокатору. Причём аллокаторов может быть много.
SLIM писал(а):Да, но я вот говорю что нет гарантии (теоретически) что вызывающая сторона правильно сможет очистить буфер. Вдруг это будет программа на Java, сможет ли она корректно освободить участок, созданный с помощью malloc на C++?
SLIM писал(а):Только не парную функцию создавать, а одну функцию по очистке памяти, которая разом все очистит
Twister писал(а):Ну, а по поводу "одной функции, которая разом все очистит", это конечно бред. Как ты представляешь себе её работу? Смотри: у тебя выделено 100 кусков памяти, 50 из них еще в работе, 50 уже не нужны. Тебе нужно отдать свободную память. Как ты это сделаешь?
Twister писал(а):Выделять же память на вызываемой стороне можно только в том случае, если сторона вызывающая использует аналогичные методики memory-management'а.
Twister писал(а):Прежде чем задаваться такими вопросами, стоит поглядеть на то, как это организовано в ОС. А организовано оно двумя способами, которые перечислил Хакер.
Twister писал(а):Выделять же память на вызываемой стороне можно только в том случае, если сторона вызывающая использует аналогичные методики memory-management'а.
SLIM писал(а):Но вот по поводу второго пункта Хакера - я такого в ОС не помню.
Видать, решение самого первого вопроса в этом топике тебе на ус не намоталось. Напомню: память может освободиться еще до того, как её к себе скопируют. Твоя же функция по очистке это сделает. Да и вообще, что за ересь? Ты так и будешь описывать работу своей библиотеки - "вызывающая сторона должна как можно быстрее скопировать память к себе, так как в любой момент её может уже не быть"? Прежде чем начинать изобретать свой "сборщик мусора" подумай, а зачем он вообще здесь?По поводу - 50 еще в работе. Суть в следующем, вызывающая сторона должна копировать данные себе, а не использовать указатель, который получила. Тогда конфликта не возникнет.
Нет, как раз-таки память выделять и освобождать рекомендовано на вызывающей стороне. Я не опечатался. Мало того, я рекомендовал обратить внимание на то, как это реализовано в ОС. Второй пункт ты точно не разбирал, раз вынудил Хакера привести примеры, а теперь я вижу, что и первый не осилил.Опа...это где такое написано то? Может наоборот, выделять нельзя в вызывающей стороне а не в вызываемой?
Twister писал(а):Видать, решение самого первого вопроса в этом топике тебе на ус не намоталось. Напомню: память может освободиться еще до того, как её к себе скопируют. Твоя же функция по очистке это сделает. Да и вообще, что за ересь? Ты так и будешь описывать работу своей библиотеки - "вызывающая сторона должна как можно быстрее скопировать память к себе, так как в любой момент её может уже не быть"? Прежде чем начинать изобретать свой "сборщик мусора" подумай, а зачем он вообще здесь?
Twister писал(а):Нет, как раз-таки память выделять и освобождать рекомендовано на вызывающей стороне. Я не опечатался. Мало того, я рекомендовал обратить внимание на то, как это реализовано в ОС. Второй пункт ты точно не разбирал, раз вынудил Хакера привести примеры, а теперь я вижу, что и первый не осилил.
Вернуться в Windows-программирование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1