Delphi: memoryleak в IdStack, но кто использует IdStack?

Было огромное поток относительно включения/отключения утверждений в сборках конечных версий на comp.lang.c ++. модерируемый, который, если у Вас есть несколько недель, Вы видите, как варьировался, мнения об этом. :)

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

  1. Умирают с некоторым отказом типа ОС, приводящим к вызову для прерывания. (Без утверждают)
  2. , Умирают через прямой вызов аварийного прекращения работы. (С утверждают)

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

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

Лично, однако, я не уверен, что пошел бы за исключениями для этого случая также. Исключения лучше подходят туда, где подходящая форма восстановления может произойти. Например, может случиться так, что Вы пытаетесь выделить память. Когда Вы ловите 'станд.:: bad_alloc' исключение это могло бы быть возможно к свободному память и попробовать еще раз.

7
задан Vegar 13 August 2009 в 09:43
поделиться

4 ответа

Все модули Indy имеют префикс «Id», поэтому проверьте, есть ли у вас какой-либо из них в ваших разделах uses.

Другой способ - разместить точку останова в TIdStack.create () . В конце концов, виновный появится в стеке вызовов.

4
ответ дан 6 December 2019 в 10:52
поделиться

В сети много об этом, хотя и разрозненно. Это также зависит от того, используете ли вы Indy 9 (с D7) или новее. Меня это тоже осуждает. Для Indy 9 я сделал следующее в IdComponent.pas:

initialization
  GStackCriticalSection := TCriticalSection.Create;

  // BJF Starts
  //RegisterExpectedMemoryLeak(GStackCriticalSection);
  // BJF Ends

finalization
  // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
  // tries to access it. App will kill it off anyways, so just let it leak

  // BJF has removed comments
  FreeAndNil(GStackCriticalSection);
end.

Но учтите, что вы должны указать путь к исходному тексту Indy в пути к библиотеке. Я считаю, что Indy 10 исправлен в этом отношении. Брайан

4
ответ дан 6 December 2019 в 10:52
поделиться

Посмотрите на использование в вашем .dpr Используйте cnPack (cnPack.org) и выберите «Uses Cleaner», чтобы удалить блоки, на которые нет ссылок

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

Диспетчер памяти Delphi FastMM предоставляет метод

function RegisterExpectedMemoryLeak(P: Pointer): boolean;

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

8
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

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