GetMem x ReallocMem

Я на самом деле приятно удивлен, кто-то спросил, прежде чем сделать это неправильно.

Однако, то, что вы спрашиваете, довольно широко для одного ответа. Я бы посоветовал пройти хотя бы какой-нибудь базовый курс по криптографии (я бы порекомендовал Coursera . Даже если вы не закончите свой курс, вы получите довольно хорошие основы, что и почему вы должны или не должны делать) не делать.

простое приложение для входа в систему, где мне нужно хранить значения в БД

blockquote>

Если значения вы имеете в виду пароли пользователей, то используйте хеш с медленным засолением, пожалуйста, прочтите [ 112] https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/

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

Код будет очень полезным

blockquote>

, вы можете проверить https: // gusto77.wordpress.com/2017/10/30/encryption-reference-project/

что такое алгоритм, ключ, отступы и почему мы должны использовать getBytes ().

blockquote>

Я начну с байтов. Шифрование работает с байтовыми массивами. Так что для любого xt вам нужно конвертировать ваши данные, ключи, пароли, .. в байтовые массивы. Также зашифрованные данные являются байтовыми массивами.

Для алгоритма, заполнения, .. Я действительно советую вам узнать об этом немного больше самостоятельно.

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

Просто для примера, обычно используется AES/CBC/PKCS5Padding

.Можно ввести предопределенное фиксированное слово или мы можем установить наш собственный ключ. [ 1121] blockquote>

Ключ - это ваше секретное значение, вам нужен тот же ключ для расшифровки зашифрованных данных, но ключ ваш, лучше всего, если он случайный

5
задан Cesar Romero 20 February 2009 в 19:06
поделиться

2 ответа

GetMem всегда выделяет память, FreeMem всегда выпускает/освобождает память, ReallocMem может сделать один, другой или оба. На самом деле, при надлежащем использовании ReAllocMem является действительно единственным управлением памятью необходимый API. Если Вы запускаете с нулевого указателя и называете ReAllocMem с размером> 0, то он действует как GetMem. Если Вы называете ReAllocMem с размером = 0, то он действует как FreeMem. Единственное время это на самом деле "перераспределяет" память, - то, если указатель является ненолем и размером> 0.

Новый и Располагают, разработаны для работы с введенными указателями или для Вас "старые-skool" люди, более старая объектная модель Turbo Pascal (старый "объект) синтаксис. Новый и Располагают, также гарантирует, что любой введенный указатель, который является ссылкой на управляемый тип, правильно инициализирует тот тип. Например, учитывая следующее:

type
  PMyRec = ^TMyRec;
  TMyRec = record
    Name: string;
    Value: Variant;
  end;

var
  Rec: PMyRec;
begin
  New(Rec);
  try
    Rec.Name := 'TestValue';
    Rec.Value := 100;
    ...
  finally
    Dispose(Rec);
  end;
end;

Новый и Располагают, гарантирует, что поля Name и Value записи правильно инициализированы и завершены или очищены. Новый и Располагают, в вышеупомянутом случае эквивалентно:

GetMem(Rec, SizeOf(Rec^));
Initialize(Rec);
...
Finalize(Rec);
FreeMem(Rec);

Для примера Вы дали, Gamecat является правильным, Вы, вероятно, были бы более обеспеченным использованием динамического массива, так как ими лучше управляет компилятор, и они также несут свою собственную внутреннюю длину. С Вашим примером необходимо было бы отдельно отслеживать количество объектов в массиве, таком, что везде, куда Вы раздали массив, необходимо будет также раздать, в настоящее время выделяют длину. При помощи динамического массива вся информация сохранена аккуратно упакованной вместе. Это позволило бы Вам выполнять итерации по массиву независимо от текущей длины путем простого выполнения одного из следующих действий:

var
  Member: TMemberData;
  Items: array of TMemberData;
  ...
begin
  SetLength(Items, Value);
  for Member in Items do  // iterate over each element in the array
  ...
  for Low(Items) to High(Items) do // same as above only using std functions
  ...
end;

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

20
ответ дан 18 December 2019 в 06:52
поделиться

GetMem выделяет блок памяти. ReallocMem перераспределяет блок памяти.

Но Вы лучше используете динамические массивы:

var
  FItems : array of TMemberDataList;

begin
  SetLength(FItems, Value);
end;

Больше Delphi путь.

Пример

Вы могли или сделать:

type
  TMemberDataList = array[0..MaxClassMembers -1] of TMemberData;

var
  FItems: TMemberDataList;
begin
  // Don't need to allocate FItems
end;

Или:

type
  TMemberDataList = array of TMemberData;

var
  FItems: TMemberDataList;
begin
  SetLength(FItems, MaxClassMembers);
end;

Переменные класса являются указателями. Таким образом, Вы не должны использовать явные указатели как, мы имели отношение к TP. Все еще можно использовать указатели на записи или объекты, но нет никакой причины сделать это.

3
ответ дан 18 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

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