Определение перевыделения () поведение прежде, чем назвать его

Я дам вам общие советы, чтобы вы пошли глубже.

Прежде всего, я рекомендую вам эту архитектуру, которая характерна для веб-приложений или даже настольных приложений, чтобы получить внешний интерфейс отдельно от внутреннего сервера:

Внешний интерфейс будет связываться с сервером по HTTP-запросу через внутренний REST API, используя формат JSON или XML для обмена сообщениями. В реальной жизни есть физически разделенные, но просто создайте 2 разных Java-проекта, работающих на разных портах.

  1. Что касается серверной части, просто следуйте инструкциям, чтобы настроить и запустить сервер REST API. Настройте шаблон MVC: уровень контроллера, уровень обслуживания, уровень репозитория, уровень модели, слои dto и т. Д. Для вашей конкретной модели я рекомендую вам следующее:

selected_date: Date

входные данные: Карта строк

размер: целое число

  1. В Front-end проекте с Java FX просто повторно используйте уже написанный код и добавьте немного CSS, если хотите. Используйте действия компонентов для вызова внутреннего REST API для создания, извлечения, обновления и удаления ваших данных из средства выбора даты или любой другой операции, которую вы хотите выполнить.

Вы будете постоянно преобразовывать java-объекты в строки JSON, я рекомендую вам использовать библиотеку Gson или библиотеку Jackson, которые делают это напрямую, и нет необходимости создавать JsonObject вручную. Если вы все еще хотите записать JSON в файл, преобразуйте объект java в строку (это строка с объектом, записанным в формате JSON), используя упомянутые библиотеки, а затем запишите эту строку в файл. Но я твердо верю, что если вы внедрите базу данных, будет больше практики.

Надеюсь, это поможет.

6
задан Ant 19 October 2008 в 14:57
поделиться

7 ответов

realloc()поведение, вероятно, зависит от своей определенной реализации. И базирование Вашего кода этого было бы ужасным взломом, который, по меньшей мере, нарушает инкапсуляцию.

Лучшее решение для Вашего определенного примера:

  1. Найдите размер текущего буфера
    • Выделите новый буфер (с malloc()), больше, чем предыдущий
    • Скопируйте префикс, который Вы хотите к новому буферу
    • Скопируйте строку в предыдущем буфере к новому буферу, начав после префикса
    • Выпустите предыдущий буфер
7
ответ дан 10 December 2019 в 00:46
поделиться

Как отмечено в комментариях, случай 3 в вопросе (никакая память) является неправильным; realloc() возвратит ПУСТОЙ УКАЗАТЕЛЬ, если не будет никакой памяти, доступной [вопрос, теперь зафиксированный].

Steve McConnell в 'Коде, Завершенном', указывает на это, если Вы сохраняете возвращаемое значение от realloc() в единственной копии исходного указателя, когда realloc() сбои, Вы только что пропустили память. Это:

void *ptr = malloc(1024);
...
if ((ptr = realloc(ptr, 2048)) == 0)
{
    /* Oops - cannot free original memory allocation any more! */
}

Различные реализации перевыделения () будут вести себя по-другому. Единственная безопасная вещь принять состоит в том, что данные будут всегда перемещаться - что Вы будете всегда получать новый адрес когда Вы перевыделение () память.

Как кто-то еще указал, если Вы обеспокоены этим, возможно, пора посмотреть на Ваши алгоритмы.

2
ответ дан 10 December 2019 в 00:46
поделиться

Если obstacks являются хорошим соответствием для Ваших потребностей выделения памяти, можно использовать их быструю растущую функциональность. Obstacks являются функцией glibc, но они также доступны в libiberty библиотеке, которая является довольно портативной.

0
ответ дан 10 December 2019 в 00:46
поделиться

Был бы, храня Вашу строку, назад помогают?

Иначе... просто malloc () большему количеству пространства, чем Вы нужно, и когда Вы выбегаете из комнаты, копируете в новый буфер. Простая техника состоит в том, чтобы удвоить пространство каждый раз; это работает вполне прилично потому что, чем больше строка (т.е. больше времени, копируя в новый буфер будет, берет), тем менее часто она должна произойти.

Используя этот метод можно также исправиться - выравнивают строку в буфере, таким образом, легко добавить символы к запуску.

1
ответ дан 10 December 2019 в 00:46
поделиться

Нет - и если Вы думаете об этом, это не может работать. Между Вами проверяющий, что это собирается сделать и на самом деле делает его, другой процесс мог выделить память. В многопоточном приложении это не может работать. Между Вами проверяющий, что это собирается сделать и на самом деле делает его, другой поток мог выделить память.

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

0
ответ дан 10 December 2019 в 00:46
поделиться

Почему бы не сохранять некоторое пустое пространство буфера в левых строки, как так:

char* buf = malloc(1024);
char* start = buf + 1024 - 3;
start[0]='t';
start[1]='o';
start[2]='\0';

Включать к началу Вашей строки сделать это "onto\0":

start-=2;
if(start < buf) 
  DO_MEMORY_STUFF(start, buf);//time to reallocate!
start[0]='o';
start[1]='n';

Таким образом, Вы не должны будете продолжать копировать свой буфер каждый раз, когда Вы хотите сделать вставку вначале.

Если необходимо сделать вставки в обоих начало и конец, просто имейте некоторое место, выделенное в обоих концах; для вставок в середине будете все еще нужны Вы для перестановки элементов вокруг, очевидно.

0
ответ дан 10 December 2019 в 00:46
поделиться

Я не думаю, что это возможно кросс-платформенным способом. Вот код для ulibc реализации, которая могла бы дать Вам ключ к разгадке, как сделать itin зависимого платформы путь, на самом деле лучше найти glibc источник, но этот был сверх поиска Google :)

0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: